aws-nukeで作るマルチアカウントのお掃除機能
hiropy
デロイト トーマツ ウェブサービス株式会社(DWS)公式ブログ
今月のはじめに、弊社のコーポレートサイトを一部リニューアルしている。
内容だけではなく、バックエンドのシステム側も AWS OpsWorks を使って構築した環境へデプロイしていたものから、 Amazon EC2 Container Service (ECS) を使った Docker
ベースのものへと変更している。
弊社では、これまで開発環境では Docker
を使っていたが、本番環境での Docker
運用はしていなかった。
そろそろ本番環境でも Docker
を使った環境に移行したいと思い、 ECS
環境への移行を行った。
今回は、その移行の際のポイントをまとめてみたいと思う。
Docker
を使っており、Docker Hub を使っていたので、そのまま ECS
でも Docker Hub を使っている(今回は Amazon EC2 Container Registry (ECR) は使わない)Ruby on Rails
で稼働している弊社コーポレートサイトが一通り動作する、ビルド済みのベースとなるイメージを置くCircleCI
でテストを実行する際は、そのベースイメージを Pull
してアプリケーションのソースを追加、テストが通ったら、アセットファイル群をプリコンパイルして、デプロイ。そうすることで、0からビルドするよりは時間の短縮が出来るAWS ECR
ではなくて、Docker Hub を使う場合、 ECS
対応 AMI
の場合は下記のように /etc/ecs/ecs.config
に追加する必要があるECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"ユーザー名","password":"パスワード","email":"メールアドレス"}}
これを、 EC2
インスタンス起動時に追加できるように、 EC2
のユーザーデータに設定
#!/bin/bash
echo "ECS_ENGINE_AUTH_TYPE=docker" >> /etc/ecs/ecs.config
echo 'ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"ユーザー名","password":"パスワード","email":"メールアドレス"}}' >> /etc/ecs/ecs.config
CircleCI
のバージョンは、ベータ中の 2.0
の検証がまだ出来ていないので、 1.0
を使用2.0
では docker-compose
が使えたり、かなり便利になっているようなので、検証が出来次第そちらに移行したいと考えているtar
ファイルとして保持しておくtar
ファイルを読み込んで、ビルドを高速化tar
ファイルが配置されている ~/docker
ディレクトリはキャッシュする設定を追加dependencies:
cache_directories:
- "~/docker"
override:
- if [[ -e ~/docker/image.tar ]]; then docker load -i ~/docker/image.tar; fi
- docker build --rm=false -t app .
- mkdir -p ~/docker; docker save app > ~/docker/image.tar
MySQL
は Docker
コンテナを使わないCircleCI
環境でデフォルトで起動する MySQL
を使って、テストを行う( DB
のコンテナは作成しない)MySQL
に接続するため、接続用のユーザー作成を行うdatabase:
override:
- mysql -uroot mysql < scripts/create_rails_user.sql
scripts/create_rails_user.sql
は下記のような内容。
GRANT ALL PRIVILEGES ON *.* TO 'rails'@'%' identified by "rails";
FLUSH PRIVILEGES;
MySQL
に接続するため、外部接続設定(bind-address
の行をコメントアウト)を変更machine:
pre:
- sudo sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/mysql.conf.d/mysqld.cnf
docker run
で、下記のように実行test:
override:
- docker run --add-host db:$(ip addr show docker0 | grep "inet" | awk '{print $2}' | cut -d/ -f1) -e RAILS_DATABASE_HOST=db app bundle exec rspec spec
CloudWatch
で確認できるように例えば unicorn
の設定ファイル config/unicorn.rb
のログファイルの設定箇所をコメントアウトして、標準出力にすることで、 ECS
で設定している CloudWatch
のロググループにログストリームを送信できるようになる。
# log
# stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
# stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
Blue Green Deployment
が出来てしまうのでこれを利用CircleCI
からは、下記のように実行している- $(aws ecr get-login --region ap-northeast-1)
- docker tag app mmmcorp/corporate_web:$CIRCLE_SHA1
- docker push mmmcorp/corporate_web:$CIRCLE_SHA1
- ./scripts/ecs-deploy --timeout $ECS_TIMEOUT -c $PRD_ECS_CLUSTER -n $PRD_ECS_SERVICE -i mmmcorp/corporate_web:$CIRCLE_SHA1
Docker
の監視が出来る Datadog
を使用CircleCI
で Docker
コンテナをビルド、テスト実行して、 ECS
へデプロイする際のポイントをざっくりとまとめてみた。
同じような環境を構築しようとしている方に、何か少しでも役に立てれば幸いである。CircleCI 2.0
を使うことになった際には、また設定等の変更が必要になるので、そのときにはまた改めてブログにまとめられるといいかな、と思っている。