Amazon ECS と Fargate でコンテナを動かす
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
準備 8 項目中 1 番目
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みであること
- ECR・ECS の操作と、IAM ロール(タスク実行ロール)の作成ができる権限があること
- 以下のリソースが作成済みであること
| リソース種別 | リソース名 | 内容 |
|---|---|---|
| VPC | ecs-vpc | 10.0.0.0/16 |
| サブネット | ecs-public-subnet-1a | 10.0.1.0/24(ap-northeast-1a、インターネットゲートウェイ経由で外部と通信できる) |
| サブネット | ecs-public-subnet-1c | 10.0.2.0/24(ap-northeast-1c、インターネットゲートウェイ経由で外部と通信できる) |
| セキュリティグループ | ecs-web-sg | インバウンド: HTTP(TCP 80)を 0.0.0.0/0 から許可 / アウトバウンド: すべて許可 |
VPC とサブネットの基本は「Amazon VPC で仮想ネットワークを構築しサブネットを設定する」、セキュリティグループの考え方は「セキュリティグループとネットワーク ACL でアクセスを制御する」で解説しています。
準備 8 項目中 2 番目
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| ECR プライベートリポジトリ | ecs-handson-nginx | nginx イメージ(タグ v1)の保存先 |
| ECS クラスター | ecs-handson-cluster | タスクとサービスをまとめるクラスター |
| ECS タスク定義 | ecs-handson-task | nginx コンテナを Fargate(0.25 vCPU / 0.5 GB)で動かす設計図 |
| IAM ロール | ecsTaskExecutionRole | ECR からのイメージ pull とログ送信に使うタスク実行ロール(タスク定義の作成時にコンソールで作成。既にある場合はそれを使う) |
| ECS サービス | ecs-handson-service | タスクを 1 つ動かし続けるサービス |
手順 8 項目中 3 番目
ステップ1: ECR のプライベートリポジトリを作成する
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
ECRと入力し、表示された「Elastic Container Registry」を選択します - 左側ナビゲーションの「プライベートレジストリ」→「リポジトリ」を選択し、「リポジトリを作成」をクリックします
- 以下を設定します
- リポジトリ名:
ecs-handson-nginx - イメージタグのミュータビリティ:
Mutable(デフォルト) - 暗号化設定:
AES-256(デフォルト)
- リポジトリ名:
- その他の項目はデフォルトのままにし、「作成」をクリックします
- リポジトリ一覧に
ecs-handson-nginxが表示されたら、その「URI」(<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ecs-handson-nginx)を控えておきます
手順 8 項目中 4 番目
ステップ2: CloudShell で nginx のイメージを pull して ECR に push する
AWS CloudShell には Docker がプリインストールされており、CloudShell の中から ECR にイメージを push できます。CloudShell の Docker で使える領域は限られているため、ここではサイズの小さい Alpine Linux ベースの nginx イメージを使います。
- コンソール上部のツールバーにある CloudShell のアイコンをクリックし、CloudShell を起動します(リージョンが
ap-northeast-1のままであることを確認します) - Docker が使えることを確認します
docker --version
- アカウント ID とレジストリの URL を変数に入れます
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
ECR_URL=${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
echo ${ECR_URL}
- ECR Public Gallery で公開されている nginx のイメージを pull します(ECR Public は匿名で pull できるため、ログインは不要です)。後で Fargate の
Linux/X86_64で動かすので、プラットフォームを指定します
docker pull --platform linux/amd64 public.ecr.aws/nginx/nginx:stable-alpine
- Docker を自分のプライベートレジストリに認証させます。
Login Succeededと表示されれば成功です(この認証は 12 時間有効です)
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${ECR_URL}
- pull したイメージに、自分のリポジトリ名とタグ
v1を付けます
docker tag public.ecr.aws/nginx/nginx:stable-alpine ${ECR_URL}/ecs-handson-nginx:v1
- イメージを ECR に push します
docker push ${ECR_URL}/ecs-handson-nginx:v1
最後に v1: digest: sha256:... の行が表示されれば push は完了です。
- ECR コンソールに戻り、リポジトリ一覧で
ecs-handson-nginxをクリックします - 「イメージ」の一覧に、イメージタグ
v1のイメージが表示されていることを確認します
手順 8 項目中 5 番目
ステップ3: ECS クラスターを作成する
- 上部の検索バーに
ECSと入力し、表示された「Elastic Container Service」を選択します - 左側ナビゲーションの「クラスター」を選択し、「クラスターの作成」をクリックします
- 「クラスター設定」の「クラスター名」に
ecs-handson-clusterと入力します - 「インフラストラクチャ」は、既定で「Fargate のみ」(サーバーレス)が選ばれているのでそのままにします
- 「モニタリング」「タグ」などその他の項目はデフォルトのままにし、「作成」をクリックします
- クラスター一覧に
ecs-handson-clusterが表示されることを確認します
そのアカウントで ECS を初めて使う場合、サービスリンクロールの作成直後に「Unable to assume the service linked role」というエラーが出ることがあります。数十秒待ってからもう一度「作成」をクリックします。
手順 8 項目中 6 番目
ステップ4: タスク定義を作成する
- 左側ナビゲーションの「タスク定義」を選択し、「新しいタスク定義の作成」→「新しいタスク定義の作成」をクリックします
- 「タスク定義の設定」で、タスク定義ファミリーに
ecs-handson-taskと入力します(初期値の自動生成された名前を書き換えます) - 「インフラストラクチャの要件」で以下を設定します
- 起動タイプ:
AWS Fargateにチェック(デフォルト) - オペレーティングシステム/アーキテクチャ:
Linux/X86_64 - ネットワークモード:
awsvpc(Fargate では固定) - タスクサイズ: CPU を
1 vCPUから.25 vCPUに変更します。メモリは互換性のある最小値の.5 GBに自動で調整されます - タスクロール:
-(なし)のまま(今回のコンテナは AWS の API を呼ばないため) - タスク実行ロール:
デフォルトロールを作成(デフォルト。作成時にecsTaskExecutionRoleが作られます。既にある場合はそれが使われます)
- 起動タイプ:
- 「コンテナ - 1」で以下を設定します
- 名前:
web(初期値を書き換えます) - イメージ URI: ステップ1で控えた URI の末尾に
:v1を付けたもの(<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ecs-handson-nginx:v1) - 必須コンテナ:
はい - ポートマッピング: コンテナポート
80、プロトコルTCP(ポート名・アプリケーションプロトコルは空欄・デフォルトのまま)
- 名前:
- 「ログ収集」は Amazon CloudWatch に送る設定(デフォルト)のままにします
- その他の項目はデフォルトのままにし、「作成」をクリックします
- タスク定義
ecs-handson-taskのリビジョン1が作成されたことを確認します
手順 8 項目中 7 番目
ステップ5: Fargate のサービスを作成する
- 左側ナビゲーションの「クラスター」を選択し、
ecs-handson-clusterをクリックします - 「サービス」タブで「作成」をクリックします
- 「サービスの詳細」で以下を設定します
- タスク定義ファミリー:
ecs-handson-task(リビジョンは最新の1) - サービス名:
ecs-handson-service
- タスク定義ファミリー:
- 「環境」の「コンピューティング設定」で、コンピューティングオプションを既定の「キャパシティープロバイダー戦略」から「起動タイプ」に切り替え、起動タイプ
Fargate、プラットフォームバージョンLATESTを指定します(どちらも既定値です) - 「デプロイ設定」で、サービスタイプ
レプリカ、必要なタスク1を指定します
- 「ネットワーキング」を開き、以下を設定します
- VPC:
ecs-vpc(vpc-xxxx ecs-vpcの形で表示されます) - サブネット:
ecs-public-subnet-1aとecs-public-subnet-1cの 2 つが選ばれていることを確認します(VPC を選ぶと VPC 内のサブネットがすべて選択されます) - セキュリティグループ: 「既存のセキュリティグループを使用」のまま、初期選択の
defaultを外してecs-web-sgを選択 - パブリック IP: オン(デフォルト)
- VPC:
- 「ロードバランシング」などその他の項目はデフォルト(ロードバランサーなし)のままにし、「作成」をクリックします
パブリックサブネットで Fargate のタスクが ECR からイメージを pull するには、タスクにパブリック IP が付いているか、インターネットへの経路が必要です。パブリック IP をオンにし忘れると、イメージを取得できずにタスクが起動しない点に注意が必要です。
手順 8 項目中 8 番目
ステップ6: タスクの起動を確認し、ブラウザでアクセスする
- サービスの作成が終わったら、クラスター
ecs-handson-clusterの「サービス」タブでecs-handson-serviceをクリックします - 「タスク」タブを選択し、タスクの「前回のステータス」が「実行中」になるまで待ちます(1 分前後かかります)
- タスク ID をクリックしてタスクの詳細を開き、「設定」の「ネットワーキング」にある「パブリック IP」を確認します
- 「パブリック IP」の横の「オープンアドレス」をクリックするか、ブラウザで
http://<パブリック IP>を開きます(https://ではなくhttp://でアクセスします) - 「Welcome to nginx!」のページが表示されることを確認します
ECR に push したイメージから、Fargate 上でコンテナが起動し、インターネットからアクセスできることが確認できました。