前回までに、VPC環境とALB(アプリケーションロードバランサ)を構築し、ECSコンテナ上で動くパブリック・プライベートサブネット用の2種類のアプリケーションを作成した上で、Dockerコンテナイメージを作成してDockerHubレジストリにプッシュするところまで解説しました。構成イメージは以下の通りです。

開発するアプリケーションの構成イメージ

続く今回は、ECSクラスタを作成します。

ECSクラスタの作成

ECSクラスタは、パブリックサブネット/プライベートサブネット双方に作成します。EC2起動型のECSクラスタ自体は、ECSコンテナ(Dockerコンテナ)を実行するEC2インスタンスそのもので、EC2と同様、実行するマシンのスペックなどを選択して、各アベイラビリティゾーンごとにプロビジョニングします。

今回はサンプルのため、パブリック/プライベートサブネット共にクラスタは1つのアベイラビリティゾーンにのみしか配置しませんが、ALBからはターゲットグループでコンテナを指定するかたちになるので、ロードバランス上問題はありません。

まず、「Amazon ECS」サービスから、「クラスター」メニューを選択し、「クラスターの作成」ボタンを押下します。表示された「クラスターテンプレートの選択」画面で、「EC2 Linux + ネットワーキング」を選択し、「次のステップ」ボタンをクリックしてください。

「クラスターテンプレートの選択」画面

その後は、以下の要領に従って、ECSクラスタの設定を行います。

入力項目 説明
クラスター名 クラスタ名として任意の名称を入力します
プロビジョニングモデル クラスタとして実行するEC2インスタンスの種別を設定します。ここでは、オンデマンドインスタンスを設定します
EC2インスタンスタイプ クラスタとして実行するEC2インスタンスのスペックを設定します。Springアプリケーションを実行するECSコンテナあたり最低1GB程度メモリ消費するので、1クラスタに配置したいコンテナ数に合わせてインスタンスタイプを選択してください
インスタンス数 実行するクラスタのインスタンス数を指定します
EBSストレージ ECSクラスタのストレージサイズを設定します。Dockerイメージ自体で相当のデータサイズを消費することに加え、実行アプリケーションで使用するストレージサイズを踏まえ、大きめの値を設定してください
キーペア ECSクラスタへSSH接続するためのキーペアを指定します
VPC クラスタを作成するVPCを指定します
サブネット クラスタを作成するサブネットを指定します。ここでは、パブリック/プライベートのいずれかを指定してサブネット作成してください
セキュリティグループ ECSクラスタに設定するセキュリティグループを指定します。後述しますが、ロードバランサからの動的ポーティングを設定するため、ここでは新しいセキュリティグループを選択してください
コンテナインスタンスIAMロール 「ecsInstanceRole」を指定します(囲み記事「注意事項」を参照)

※ プロビジョニングモデルで、オンデマンドインスタンスを選択しても、EC2リザーブドインスタンスは有効になります。リザーブドインスタンスを適用するのであれば、対応するEC2インスタンスタイプを指定しましょう。

ECSクラスタの設定

注意事項

ecsInstanceRoleとは、AmazonEC2ContainerServiceforEC2Roleポリシーが付与されたIAMロールです。

{
  "Version": "2012-10-17",
  "Statement": [
  {
      "Effect": "Allow",
      "Action": [
          "ecs:CreateCluster",
          "ecs:DeregisterContainerInstance",
          "ecs:DiscoverPollEndpoint",
          "ecs:Poll",
          "ecs:RegisterContainerInstance",
          "ecs:StartTelemetrySession",
          "ecs:UpdateContainerInstancesState",
          "ecs:Submit*",
          "ecr:GetAuthorizationToken",
          "ecr:BatchCheckLayerAvailability",
          "ecr:GetDownloadUrlForLayer",
          "ecr:BatchGetImage",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
      ],
      "Resource": "*"
  }
  ]
}

当ポリシーをECSクラスタのIAMロールへアタッチしなければ、Dockerコンテナをサービスとして起動できなくなるため注意しましょう。

アクセス許可を追加する

次に、作成したECSクラスタのセキュリティグループ設定で、ロードバランサからの接続およびトラブルシューティング時のSSH接続のアクセス許可を追加します。特に動的ポーティングでコンテナを運用する場合、ALBからの通信でポート32768-61000を許可する必要があります。

「EC2」サービスから、「セキュリティグループ」を選択し、上記で作成したECSクラスタのセキュリティグループを選択して、インバウンドルールを変更してください。なお、ALBからの通信のソースには、ALBに設定しているセキュリティグループを指定します。

セキュリティグループ設定でアクセス許可を追加

後は、パブリック/プライベートサブネットのECSクラスタをそれぞれ作成すれば設定は完了です。

次回は、実際にECSクラスタへ配置するコンテナを定義するために、ECSタスク定義を行います。

著者紹介


川畑 光平(KAWABATA Kohei)

某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professionalなどの資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。

本連載の内容に対するご意見・ご質問は Facebook まで。