前提
- gitがインストールされている
- dockerがインストールされている
- aws-cliがインストールされている
クッキング開始
まず、以下のリポジトリをクローンしてください。
https://github.com/yutaro1204/ecs-autoscaling-demo
そして、付属のecrRepository.yaml
を利用してAWSにスタックを作成します。
parameterに指定するRepositoryNameは以降で作成するイメージと合わせる必要があります。
$ aws cloudformation create-stack --stack-name sampleECRRepository --template-body file://ecrRepository.yaml --no-disable-rollback --parameters ParameterKey=RepositoryName,ParameterValue=php_demo_image
このスタックにはECRのリポジトリが含まれ、ここに自作したイメージをプッシュします。
自分でイメージを作るのがめんどくさい方は、
git clone https://github.com/aws-samples/ecs-demo-php-simple-app.git
cd ecs-demo-php-simple-app
でPHPのデモアプリをクローンして中に入り、
src
内に以下の内容のhealthcheck.phpを配置して(src/healthcheck.php
をヘルスチェックの対象としてます)、
<?php echo "HealthCheck TEST";
$ docker build -t php_demo_image .
でこのイメージを作成します。
最初にECRリポジトリを作成した時に指定したRepositoryNameと同じ名前でbuildしています。
次にこの作成したイメージをECRのリポジトリにプッシュします。
$ aws ecr get-login --no-include-email --region ${AWS.Region}
でログインコマンドを取得し、これをそのまま実行します(以下は例)。
$ docker login -u AWS -p XXXXXX.......
で、先ほど作ったイメージにタグづけをして、
$ docker tag php_demo_image:latest ${AWS.AccountId}.dkr.ecr.${AWS.Region}.amazonaws.com/php_demo_image:latest
タグづけされたイメージをECRへプッシュします。
$ docker push ${AWS.AccountId}.dkr.ecr.${AWS.Region}.amazonaws.com/php_demo_image:latest
AWSコンソールなどでイメージがちゃんとプッシュされているか確認してみて下さい。
あとはmicroservices.yaml
のECSTaskDefinition
のContainerDefinitions
を以下のように修正して、
ECSTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- Image: '${さっきイメージをプッシュしたECRのARN}:latest'
以下のコマンドでCloudFormationのスタックを作成します。
$ aws cloudformation create-stack --stack-name sampleECSClusterWithAutoScaling --template-body file://microservices.yaml --no-disable-rollback --capabilities CAPABILITY_NAMED_IAM
数分でロードバランサーのDNSNameからPHPのデモページへと飛ぶことができるようになっているかと思います!
クッキング終了
リソースの設定値を色々といじってみて自分にあった構成を試してみてください。
たとえば、タスクやAutoScalingGroupに含まれるEC2インスタンスを意図的に削除してみたりとか。
タスクはECSのServiceが自動復旧してくれるし、EC2インスタンスもALBが認識してAutoScalingが立て直してくれると思います。