Amazon ECS Workshop - Cats and Dogs - をやってみた
概要
AWSが公式に提供している、「ECS WORKSHOP - CATS AND DOGS-」をやってみたので、
構築した環境をCloudFormationでテンプレート化してみた。
(結論)以下にテンプレートを入れました
何なりとお使いください。
どんな環境作ってるの?
こんな環境(ワークショップからそのまま拝借)。
デプロイ手順
以下のリポジトリのソースコードを使って実際にデプロイ。
尚、この手順はワークショップを見ればわかるので、
この記事の手順が意味不明な場合は大元を参照してください。
ここでは東京リージョンでデプロイを行っていきます。
ecs-c9.yml
のスタックを作成
リポジトリにあるecs-c9.yml
を使ってCloudFormationスタックを作成。スタック名は適当
Cloud9をセットアップ
-
作成されたCloud9 IDE環境にアクセス。
-
歯車のアイコンをクリックして、Preference の設定画面を開きます。メニューバーの左側から AWS SETTINGS を選択します。
-
AWS Managed Temporary Credentials をオフにします。
-
「Preference」タブを閉じます。以下に示す一時的な認証情報を削除するコマンドを実行します。
$ rm -vf ${HOME}/.aws/credentials
- 以下に示す GetCallerIdentity コマンドを実行して、Cloud9 IDEが意図したとおりにecs-demogo-WorkstationRoleを使用しているかどうかを確認します。
$ aws sts get-caller-identity --query Arn | grep ecs-demogo
- CLI ツールのインストールと更新をします。
sudo pip install --upgrade awscli
sudo yum install -y jq
- 現在のリージョンをデフォルトに設定します。
export TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
export AWS_REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure set default.region ${AWS_REGION}
※ Cloud9で指定したAMIによっては、IMDSのバージョンがv2で強制されている場合がある。Modify instance metadata optionsの設定でIMDSv2がRequiredに設定されている場合は、セッショントークンを使用してリージョンのメタデータを取得する必要があるので注意。
- デフォルトリージョンを確認します。
$ aws configure get default.region
ecr.yml
のスタックを作成
リポジトリにあるecr.yml
を使ってCloudFormationスタックを作成。スタック名は適当
Dockerイメージを作成、プッシュ
CloudFormationで作成したcats/dogsリポジトリに、実際にDockerイメージをビルド・プッシュしていく
-
Cloud9のIDEを開く
-
事前に取り込んでいるフォルダーから、Dockerファイルのあるディレクトリまで移動し、ビルド。
# catsのDockerイメージをビルド
$ cd ecsworkshop/cats
$ docker build -t cats .
# dogsのDockerイメージをビルド
cd ..
cd dogs
docker build -t dogs .
-
ビルドした各Dockerイメージをタグ付けして、各ECRにプッシュ。
プッシュコマンドは、ECRの各リポジトリを選択すると確認することができる。
各行の右端の四角いボタンをクリックすると、ステップ1、3、4の各コマンドをコピーできます。
以下はcatsのDockerイメージpushコマンド例
# 1. Retrieve an authentication token and authenticate your Docker client to your registry.
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <YOUR_ACCOUNT_NUMBER>.dkr.ecr.ap-northeast-1.amazonaws.com
# 3. After the build completes, tag your image so you can push the image to this repository
docker tag cats:latest <YOUR_ACCOUNT_NUMBER>.dkr.ecr.ap-northeast-1.amazonaws.com/cats:latest
# 4. Run the following command to push this image to your newly created AWS repository
docker push <YOUR_ACCOUNT_NUMBER>.dkr.ecr.ap-northeast-1.amazonaws.com/cats:latest
- ECRに画像が正常にプッシュされているかどうかを確認します。各リポジトリからlatestというタグ付きイメージが表示されるはずです。
ecs-container.yml
のスタックを作成
リポジトリにあるecs-container.yml
を使ってCloudFormationスタックを作成。スタック名は適当
注意点
ECSサービスはタスク定義作成後にスタック更新で作成してください
- ECSクラスター環境が整う前にECSサービスを作成しようとすると、タイミング次第でサーキットブレーカーがトリガーして、スタック作成に失敗する事象が発生
- タスク定義やAutoScalingらへんが原因で作成できないらしい。作成は完了してても直後にECSサービスが作成されようとするとなぜか失敗
- ここでは事前にECSサービスの箇所だけコメントアウトして、クラスター周り作成後にECSサービスをコメントインして、スタック更新で作成している
- CloudFormationテンプレート分ければいいのだが、メンド臭いので今回は割愛(誰かプルリクで修正とかしてくんないかな・・・)
TargetGroup03:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
...
↓↓↓↓↓↓↓↓↓↓↓ 以下はコメントアウトしておく ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#-- ECS Service --#
# Please comment in the following resources after creating the above resources
# because the ECS Deployment Circuit Breaker may triggerr and fail to create
# ECSService01:
# Type: AWS::ECS::Service
# Properties:
...
ecs-container.yml
のスタックを更新
ecs-container.yml
のコメントアウトしているリソースをすべてコメントインして、スタックを更新かける。
これでECSサービスと、監視周りのリソースも作成されるはず。
注意点
ECS Service Link Roleはまだ作成していない場合は、事前に作成しておく必要がある。
- サービスリンクロールは最初から用意されてないので、自分で作成が必要
- コンソール操作だと勝手に自動で作成されるが、CFnだと自分で作成が必要
TargetGroup03:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
...
#-- ECS Service --#
# Please comment in the following resources after creating the above resources
# because the ECS Deployment Circuit Breaker may triggerr and fail to create
↓↓↓↓↓↓↓↓↓↓↓ 以下をコメントイン ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
ECSService01:
Type: AWS::ECS::Service
Properties:
...
環境構築完了
これでワークショップの環境ができ上がりました。
あとは色々と設定をいじったりして遊んでみてください。
そのまま放置すると、料金がかさむので、使わなくなったら環境を削除しましょう。
その他苦労した点
-
ワークショップの情報が古くなっていたので、
ECS周りの設定手順は自分で調べつつ進める必要があったりした。 -
公式ワークショップで提供しているCFnテンプレートが実行エラー
- Cloud9の作成エラーが発生した
- ImageIdプロパティがテンプレート内に追記されていなかったのが原因、設定したら作成できるようになった
Discussion