ECS Exec を有効化してrun-task を実行する

#はじめに
本記事では、[ECS Exec](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html) の機能を使って、run-taskを実行する簡易ま方法について記載しています。

#前提条件
##Fargate のコンテナサイド
- ECS サービスを実行するプラットフォームのバージョンが<font color="Red">1.4.0 </font> 以降であること。
- Fargate のコンテナが Systems Manager (SSM) のエンドポイントに接続できること。 

- アクセスするタスク（コンテナ）の IAM ロール に下記のSSM エージェント実行用のポリシーをアタッチしていること。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}
```
##アクセスするクライアントサイド
- ECS Exec コマンドを実行するための AWS CLI がインストールされていること。

|AWS CLI|対応バージョン|
|:---|:---|
|v1|<font color="Red">1.19.28</font> 以降|
|v2|<font color="Red">2.1.31</font> 以降|

- AWS CLI 用の Session Manager plugin がインストールされていること。

参考：
[AWS CLI バージョン 1 のインストール、更新、およびアンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html)
[AWS CLI バージョン 2 のインストール、更新、およびアンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)
[(オプション) AWS CLI 用の Session Manager plugin をインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)

下記コマンドで、AWS CLI が対応するバージョンか確認します。

```
$ aws --version
aws-cli/1.19.92 Python/3.7.4 Darwin/18.7.0 botocore/1.20.92
```

下記コマンドで、[Session Manager plugin がインストールされているか検証します。](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-verify)（下記のメッセージが出力されていれば、OKです。）

```
$ session-manager-plugin

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

```

#ECS Exec を有効化してrun-task を実行する
run-task のコマンドオプションに、<font color="Red">--enable-execute-command </font>を設定する箇所がポイントとなります。

```shell
#!/bin/bash
#
# ECS Exec を有効化して run-task
#

# クラスター名
CLUSTER_NAME="xxxxxxxxxxxxxxxxx"
# サブネットID
SUBNET_ID="subnet-xxxxxxxxxxxxxxxxx"
# タスク定義名
TASK_NAME="xxxxxxxxxxxxxxxxx"
# セキュリティグループID
SG_ID="sg-xxxxxxxxxxxxxxxxxx"
# パブリックIP割当て（ENABLED もしくは DISABLED）
PUBLIC_IP_ASSIGN="ENABLED"

# タスク定義 ARN
TASK_DEF_ARN=$(aws ecs list-task-definitions \
--family-prefix "${TASK_NAME}" \
--query "reverse(taskDefinitionArns)[0]" \
--output text) \
&& echo "${TASK_DEF_ARN}"

# ネットワーク
NETWORK_CONFIG="awsvpcConfiguration={subnets=[${SUBNET_ID}],securityGroups=[${SG_ID}],assignPublicIp=${PUBLIC_IP_ASSIGN}}"

# タスク実行
aws ecs run-task \
--cluster "${CLUSTER_NAME}" \
--task-definition "${TASK_DEF_ARN}" \
--network-configuration "${NETWORK_CONFIG}" \
--enable-execute-command \
--launch-type FARGATE

```
#ECS Exec を有効化したコンテナにアクセスする

ECS Exec を有効にして起動した **タスク ID** を確認します。
![01_fargate_ecs_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/db952138-f540-4417-fd5e-b12e14197451.png)

下記コマンドで、Fargate のコンテナにアクセスします。（Starting session...と出力されれば OK です）

```shell
aws ecs execute-command \ 
--cluster {クラスタ名} \
--task {タスク ID} \
--container {コンテナ名} \
--interactive --command "/bin/sh"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-07cfe2faxxxxxxxxxxxxxxxxx

```

##参考
[AWS CLI を使って Amazon ECS のタスクを手動で実行する](https://michimani.net/post/aws-run-ecs-task-using-aws-cli/)