雰囲気でAWSを使ってる人でもECS Execを使ってFargateコンテナにアクセスできるようになるためのチュートリアル

11 min read読了の目安(約9900字

FargateってEC2みたいに中入ってコマンド実行とかできないんでしょ? デバッグの時辛いよねー。
そんな時代はもう終わりました。そう、つい先日リリースされたECS Execによって!

https://aws.amazon.com/jp/blogs/news/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/

みんなが待ち望んでいたこの機能、早速試してみたいと思った方は数多くいらっしゃるはず。
しかし残念なことに現時点ではAWS CLIでしか動かすことができません。

まぁこれはちょっとめんどくさいですね(そもそもECSの環境を1から作ること自体...)。
「試すにしてもマネジメントコンソール対応後で」 そんな方も結構いらっしゃるでしょう。

いやしかし待ってください!逆に今こそやるべきではないでしょうか? 周囲に軽くドヤれるかもしれませんし(?) もしくは今まで目を背けてきたAWS CLIに触れてみるのも良いでしょう? そして何より Fargateのコンテナに入ってコマンド叩けるのは謎の爽快感があります!(多分今だけ)

こんな話に魅力を感じてしまう(少し前の私のような)人のためにチュートリアルを作ってみました。VPCすら無いまっさらな環境からでもFargateコンテナにアクセスできるようになる、そんなレベル感で作っています。

噂のECS Exec試してみたい!けど自分で調べて考えるのめんどくさい...という方はぜひ当記事を参照してみてください。

対象読者

  • AWSを雰囲気で使ってる方
  • AWS ECSをなんとなーくで触ってる方
  • AWS CLIをたまに、仕方無しに利用している方
  • 「ECS Execって知ってる? EC2みたいにFargateのコンテナに入れるんだよねー。あーやってみたけど簡単だったよ?」ってドヤりたいけど、公式サイトとか見ながら試すのはめんどくさい方

書かないこと

  • AWS関連の用語の説明(VPC/IAMなど)
  • ECS関連の用語の説明(クラスタ、サービス、タスク定義など)

留意事項

(めんどくさくない範囲で)極力AWS CLIを使います。理由は私自身が「今まで目を背けてきたAWS CLI」に触れてみたかったからです! ある程度コピペでいけるようにするつもりですが、マネジメントコンソールが良い方は置き換えてください。

流れ

チュートリアルは以下の構成となっています。

  1. AWS CLIのインストール or 更新
  2. プロファイル & リージョンの設定
  3. ネットワーク設定
  4. ECS関連のIAMロール (※)
  5. クラスターの作成
  6. タスク定義の作成&登録
  7. サービスの作成 (※)
  8. ECS ExecによるFargateコンテナへのアクセス (※)

(※) がECS Exec固有の設定項目です。実はECS Execだけで見たらやることはごくわずかです。準備が大変なんですね...(知ってた)

本編

1. AWS CLIのインストール or 更新

ECS Execを試すためには最新のAWS CLIが必要です。以下のドキュメントを参照してください。
既にAWS CLIをインストール済みの方も必ず更新しましょう!

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html

例えばmacでは以下のコマンドを実行することになります。

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

AWSのドキュメントはとっつきにくい印象がありますが、この辺りの手順に関してはとても分かりやすく書かれています。公式ドキュメントアレルギーな方もぜひ試してみてください。「全部ちゃんと書いてあるやん...」となることうけあいです。

つい先日までは ECS Execは AWC CLIのv1でしか動かなかったようですが、v2.1.31以降では対応しているようです(参考: https://dev.classmethod.jp/articles/ecs-exec/)。
v2の最新バージョンを入れるのが良いでしょう。

2. プロファイル & リージョンの設定

AWS CLIのコマンドを実行する際には、同時にプロファイル & リージョンを指定する必要があります。やり方は色々あると思いますが、個人的には以下の参考記事のように毎回 --profile XXX を指定するやり方が安心でオススメです

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html
https://qiita.com/suuungwoo/items/66f39ac1d12c7a800d98

今後本チュートリアルで AWS CLIコマンドを載せるときは、末尾に --profile myadminと付きますが、この設定によるものです。必要に応じて置き換えてください。

3. ネットワーク設定

ECSだけさらっと試せれば良いのですが残念ながらそういうわけにはいきません。ちゃんとVPCやsubnetその他も設定する必要があります。

幸いこの点に関しても公式に分かりやすい手順書があります。
そちらに沿ってやっていきます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-subnets-commands-example.html

なお以下の設定はこのチュートリアル用で必要となる最低限の内容となっています。セキュリティ等の問題から他の用途には用いないでください。

VPCの作成

aws ec2 create-vpc --cidr-block 10.0.0.0/16 --profile myadmin
# 返される出力のうち`VpcId`は次の手順で使うので書き留めておいてください。

サブネットの作成

aws ec2 create-subnet --vpc-id *vpc-xxxxxxxxxxxx* --cidr-block 10.0.1.0/24 --profile myadmin
# `*vpc-xxxxxxxxxxxx*`には書き留めておいた`VpcId`を使ってください。
# 返される出力の`SubnetId`も書き留めておいてください

インターネットゲートウェイの作成 & サブネットのパブリック化

サブネットのパブリック化も必要です(ECRからイメージをpullする時など)

インターネットゲートウェイの作成 & アタッチ

aws ec2 create-internet-gateway --profile myadmin
aws ec2 attach-internet-gateway --vpc-id *vpc-xxxxxxxxxxxx* --internet-gateway-id *igw-xxxxxxxxxxxx* --profile myadmin
# `InternetGatewayId`はcreate時に返される出力を書き留めておいてください
# `*vpc-xxxxxxxxxxxx*`/`*igw-xxxxxxxxxxxx*`には書き留めておいた値を用いてください

サブネットのパブリック化(ルートテーブルの作成 & 関連付け)

aws ec2 create-route-table --vpc-id *vpc-xxxxxxxxxxxx* --profile myadmin
aws ec2 create-route --route-table-id *rtb-xxxxxxxxxxxx* --destination-cidr-block 0.0.0.0/0 --gateway-id *igw-xxxxxxxxxxxx* --profile myadmin
aws ec2 associate-route-table  --subnet-id *subnet-xxxxxxxxxxxx* --route-table-id *rtb-xxxxxxxxxxxx* --profile myadmin
# `*igw-xxxxxxxxxxxx*`/`*rtb-xxxxxxxxxxxx*`はcreate時に返される出力を書き留めておいてください
# `*vpc-xxxxxxxxxxxx*`/`subnet-xxxxxxxxxxxx`/`*igw-xxxxxxxxxxxx*`/`*rtb-xxxxxxxxxxxx*`は書き留めておいた物を用いてください

4. ECS関連のIAMロール

ここからはECS関連の設定になります。まずはタスク定義作成時に必要となる、タスク実行ロール/タスクロールを作成していきます。

少しだけ補足すると、タスク実行ロールはタスクを立ち上げる際に使うロールで、タスクロールは立ち上がった後にタスク内のアプリケーションが用いるロールです。詳細は以下の記事をご参照ください。

https://akng-engineer.hatenablog.com/entry/2020/03/03/233753
https://qiita.com/working-cat/items/194830e18a7a3123f89f

雰囲気だけ掴めればOKです。

タスク実行ロールの作成

タスク実行ロールの作成に関しては何も考えず以下の手順(「タスク実行 IAM ロールの作成」)を行なってください。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_execution_IAM_role.html#create-task-execution-role

上記手順で作成を指示される、「ecsTaskExecutionRole」がすでに作成されていることもありますが、その場合はこの手順では何もしなくてOKです。

作成したタスク実行ロールのArnはあとで使いますので書き留めておいてください。

タスクロールの作成(※)

(※ ECS Exec固有の手順を含みます)

ここが少しだけめんどくさいです。以下2つを実施する必要があります。

  • ECS Exec用に別途ポリシーを作成
  • タスクロールを作成し、ECS Exec用のポリシーもアタッチ

ECS Exec用のポリシーの作成

以下の手順(「[JSON] タブでのポリシーの作成」)に従ってポリシーを作成します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor

なお「5.JSON ポリシードキュメントを入力するか貼り付けます。」の手順で入力するポリシードキュメントには以下を用いてください。

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

(Using Amazon ECS Exec for debugging - Amazon Elastic Container Serviceの「IAM permissions required for ECS Exec」より転記)

ECS Exec用タスクロールの作成

作成したポリシーを利用してタスク用のIAMロールを作成します。以下の手順「(タスク用の IAM ロールを作成するには)」に従ってタスクロールを作成してください。
なお前項で作成したECS Exec用ポリシーは、「6. [アクセス権限ポリシーをアタッチする] セクションで、タスクで使用するポリシーを選択します」の手順においてアタッチします。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html#create_task_iam_policy_and_role

作成したタスクロールのArnはあとで使いますので書き留めておいてください。

5. クラスターの作成

ここからは本格的にECSの環境を構築していきます。とはいっても以降はチュートリアル: AWS CLI を使用して Fargate タスクのクラスターを作成する - Amazon Elastic Container Service
を参考にほぼコマンドを実行するだけなので楽勝です。

まずはクラスターを作成します。

aws ecs create-cluster --cluster-name 'ecs-exec-cluster' --profile myadmin

6. タスク定義の作成&登録

タスク定義の作成&登録を行います。(チュートリアル: AWS CLI を使用して Fargate タスクのクラスターを作成する - Amazon Elastic Container Serviceが手順のベースになっています)

タスク定義の作成

タスク定義ファイルとして、ローカルに以下のJSONファイルを作成してください。その際以下2点に注意してください

  • "taskRoleArn"に書き留めておいた「タスクロールのArn」を入力してください。
  • "executionRoleArn"に 書き留めておいた「タスク実行ロールのArn」を入力してください
{
    "taskRoleArn": - "arn:aws:iam::XXXXXXXXXXXX:role/ecsExecRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
    ],
    "executionRoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/ecsTaskExecutionRole",
    "memory": ".5 gb",
    "cpu": ".25 vcpu",
    "containerDefinitions": [
        {
            "name": "amazon-linux",
            "image": "amazonlinux:latest",
            "essential": true,
            "command": ["sleep","3600"],
            "linuxParameters": {
                "initProcessEnabled": true
            }
        }
    ],
    "family": "ecs-exec-task"
}

(Using Amazon ECS Exec for debugging - Amazon Elastic Container Serviceより転記)

タスク定義の登録

作成したタスク定義用のJSONファイルを用いて、以下のコマンドでタスク定義の登録を行います。

aws ecs register-task-definition --cli-input-json file://$HOME/xxxxx.json --profile myadmin

(チュートリアル: AWS CLI を使用して Fargate タスクのクラスターを作成する - Amazon Elastic Container Service参照)

  • xxxx.jsonは任意の名前(パス)で置き換えてください

7. サービスの作成(※)

(※ ECS Exec固有の手順を含みます)

以下の手順(「パブリックサブネットを使用した例。」)を参考にコマンドを実行します
チュートリアル: AWS CLI を使用して Fargate タスクのクラスターを作成する - Amazon Elastic Container Service

aws ecs create-service --cluster ecs-exec-cluster --task-definition ecs-exec-task --enable-execute-command --service-name ecs-exec-service --desired-count 1 --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxxxxxxxxx],assignPublicIp=ENABLED}" --profile myadmin
# `subnet-xxxxxxxxxxxx`は書き留めていた値を用いてください

このコマンドの中の、--enable-execute-commandがECS Execを利用するためのオプションになります。実はECS Exec用の設定はタスクロールとこのオプションの指定だけです

8. ECS ExecによるFargateコンテナへのアクセス(※)

タスクの正常起動とタスクIDの確認

まずマネジメントコンソールから、作成したサービス上でタスクが正常に動作していることを確認します。その際タスクID(画像のコメント参照)を書き留めておいてください。

アクセス用コマンドの実行

タスクが正常に動作していることを確認したら以下のコマンドを実行します。

 aws ecs execute-command --cluster ecs-exec-cluster --task aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --container amazon-linux --interactive --command "/bin/sh" --profile myadmin
 # `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`には書き留めておいたタスクIDを用いてください

(Using Amazon ECS Exec for debugging - Amazon Elastic Container Service の 「Running commands using ECS Exec」参照)

うまくいっていれば以下のようにFargateのコンテナにアクセスできるはずです。

後片付け

うまくいったら最後に後片付けをしましょう。作成してきた以下のインスタンスを削除してください

  • ネットワーク関連(VPC, サブネット, インターネットゲートウェイ, ルーティングテーブル)
  • IAM関連(タスク実行ロール、タスクロール、ECS Exec用ポリシー)
  • ECS関連(クラスター、サービス、タスク定義)

最後に

いかがでしたでしょうか?うまくFargateにアクセスできましたでしょうか?

お察しの方も多いかと思いますが、この記事はマネジメントコンソールがECS Execに対応した時点でほぼ価値を無くすであろう儚い存在です(ただでさえターゲット狭そうなのに...)。「果たして頑張る意味あるのか??」という疑念と戦いながらの記事作成でした。でも書きたくなってしまったのだから仕方ないね!

少しでもどなたかの役にたてば幸いです。