今回は基本的なECS on EC2構成を作成するCloudFormationテンプレートを作成しました。
ECSについては個人利用ではあまり使うことはないと思いますが、AWSで実用的な環境を構築する上では必須だと思います。
今回は必要なセキュリティグループ、ECSクラスター周り、ロードバランサー、タスク定義とサービスを作成するテンプレートをそれぞれ作成したので、是非とも参考にしてみてください。
◆Github (テンプレートはこちら)
https://github.com/noname-work/aws-cloudformation/tree/master/ecs/ecs-on-ec2
構築環境

ユーザーがパブリックサブネット上に構築されたロードバランサーのエンドポイントにアクセスすることで、ECS上で実行されているコンテナにアクセスをする想定で環境を作成しています。
本来であればロードバランサーの前にはCDNサービスであるCloudFrontを挟んだり、AutoScalingポリシーを設定して負荷に応じたスケーリングを実装することが望ましいのですが、今回はそこまで触れていません。
必要に応じて追記してみてください。
事前準備

初めてECSを作成するアカウントではサービスにリンクしたECS用のロールが作成されていません。
今回のテンプレートではサービスリンクロールを利用するため、[AWSServiceRoleForECS]があるか確認してください。
まだ作られていなかった場合は以下のコマンドで発行できます。
aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com
また、構成図ではPrivateSubnetが作成してありますが、今回のテンプレートでは作成しませんので必要に応じて作成しておいてください。
その他、ロードバランサーにアタッチするACMも事前に用意する必要がありますのでご留意ください。
作成順序
今回は関連リソースが多いためテンプレートを分担しています。
そのため、順番に必要なリソースを作成する必要があります。
また、汎用性を重視しているため、スタックが分割しますがOutputsを使っていません。
ECSクラスター名やセキュリティグループのIDなどをOutputsで出力しておくと、パラメータを減らせるため用途に応じて調整すると良いですね。
◆作成順
・セキュリティグループの作成
・ECSクラスターと関連リソースの作成
・ロードバランサーの作成
・タスク定義とサービスの作成
セキュリティグループのパラメータ
| ClusterName | 作成予定のECSクラスター名を入力します。 |
| VPCID | セキュリティグループを作成するVPCのIDを選択します。これは作成予定のECSクラスターと同じVPCを選択する必要があります。 |
このテンプレートではECSインスタンスとロードバランサーで利用するセキュリティグループを作成します。
ECSのパラメータ
| ClusterName | 作成予定のECSクラスター名を入力します。 |
| InstanceType | ECSのホストインスタンスで利用するインスタンスタイプを選択します。 |
| ECSSubnetIDs | ECSインスタンスを立てるサブネットを選択します。 |
| KeyName | ECSインスタンスに接続するためのキーペアを選択します。 |
| ImageId | ECSに最適化されたAMIのIDを入力します。 |
| ECSSecurityGroups | ECSインスタンスにアタッチするセキュリティグループを選択します。 |
| ScalingDesiredCapacity | ECSインスタンスの希望数です。 |
| ScalingMaxSize | ECSインスタンスの最大数です。 |
| ScalingMinSize | ECSインスタンスの最小数です。 |
ECSクラスターとホストインスタンスを実行するためのAutoScalingグループを作成します。
先ほど作成したセキュリティグループはこのテンプレートで使用します。
ここで作成されるホストインスタンスにはSSMエージェントの操作を許可するIAMポリシーがアタッチされています。
ALBのパラメータ
| ClusterName | 作成予定のECSクラスター名を入力します。 |
| VPCID | ロードバランサーで使用するVPCのIDを選択します。これはECSクラスターと同じVPCを選択する必要があります。 |
| ALBSubnetIDs | ロードバランサーで使用するサブネットを指定します。これは2つ以上を選択する必要があります。 | ALBCertificateARN | ACMに登録したSSL証明書のARNを入力します。 | ALBSecurityGroups | ロードバランサーに設定するセキュリティグループを選択します。 |
ECSのサービスで利用するためのロードバランサーを作成します。
ここではHTTPS通信を許可するためにACMで証明書をアタッチします。
このステップで作成されるターゲットグループはサービスを作成する際に必要になります。
サービスのパラメータ
| ClusterName | 作成予定のECSクラスター名を入力します。 |
| ServiceName | ECSで実行するサービスの名前を設定します。 |
| DesiredServiceCount | サービスコンテナの希望数を入力します。 |
| ImageURI | 実行するコンテナイメージのURIを入力します。デフォルトではApacheを実行します。 |
| ContainerPort | コンテナポートを入力します。デフォルトのApacheを実行する場合のポートは80です。 |
| ContainerName | タスク定義で利用するコンテナの名前を入力します。 |
| ServiceTargetGroup | ECSサービスを管理するためのターゲットグループのARNを入力します。 |
タスク定義とサービスを作成します。
ここでは任意のコンテナイメージを実行することができますが、手軽に動作の確認ができるようにApacheの公式イメージをデフォルト値にしています。
パラメータにはロードバランサーを作成した時に一緒に生成しているターゲットグループのARNを渡してください。
環境の構築後

コンソールからECSクラスターとサービスが作成されていることが確認できました。

Apacheのコンテナイメージを立ち上げてみると、ブラウザからロードバランサーのエンドポイントにアクセスした際に「It works!」が表示されます。
正常にApacheが実行していることが分かりますね。
コメントを残す