LoginSignup
5
1

More than 1 year has passed since last update.

EC2からECS Execを実行

Last updated at Posted at 2021-06-21

始めに

ECS Execの環境構築記事は多数ありますが、
それを実行する環境を構築する記事が見当たらなかったので

AWS CLIを使うケースが多いかと思いますが、
ローカル環境などで実行するとセキュリティ的に怖いので、
踏み台の先の操作用サーバー(EC2)などに構築するケースが多いかと思います

今回はこのパターンの操作用サーバー(EC2)からECS Execを実行するために必要なことを記載していきます

前提 (この記事で説明しないこと)

  • EC2のインスタンスの立ち上げ
  • ECS Exec自体の環境構築

詳細

AWS CLIの設定

PIPのインストール

sudo yum install pip

最新版のAWS CLIのインストール

Ver1のアンインストール
sudo pip uninstall awsclihttps://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-linux.html#install-linux-pip
Ver2のインストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
AWS CLIの設定
aws configure
> AWS Access Key ID [None]: # <- 未指定でOK
> AWS Secret Access Key [None]: # <- 未指定でOK
> Default region name [None]: ap-northeast-1 # <- 任意のregionを指定
> Default output format [None]: json <- お好きなformatを指定

AWS Session Managerのインストール

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
sudo yum install -y session-manager-plugin.rpm

(AWS IAM) 権限の付与

ポリシーの作成

名前は任意で

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:SimulatePrincipalPolicy"
            ],
            "Resource": [
                "arn:aws:iam::{account_id}:role/{operation_role}",
                "arn:aws:iam::{account_id}:role/{ecs_task_role}"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "ecs:ExecuteCommand",
                "ecs:DescribeTasks",
                "ecs:DescribeClusters"
            ],
            "Resource": [
                "arn:aws:ecs:{region}:{account_id}:task/*",
                "arn:aws:ecs:{region}:{account_id}:cluster/{ecs_cluster_name}"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "iam:ListRoles",
                "ecs:DescribeTaskDefinition",
                "ecs:ListTasks"
            ],
            "Resource": "*"
        }
    ]
}
注釈
  • {operation_role} -> 後述のロールの名前を指定
  • {ecs_task_role} -> ECSのタスクロールのロール名を指定
  • ecs:ListTasks -> 後述の接続コードのshで必要な部分。利用しない場合は削って良い

ロールの作成

名前は任意
上記のポリシーのoperation_roleと合わせる
また、上記ポリシーをアタッチする

EC2へのロールのアタッチ

上記ロールをEC2インスタンスにアタッチする
参考: https://aws.amazon.com/jp/blogs/news/easily-replace-or-attach-an-iam-role-to-an-existing-ec2-instance-by-using-the-ec2-console/

接続確認

aws ecs execute-command \
    --cluster {cluster_name} \
    --task {task_id} \
    --container {container_id} \
    --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-xxxxxxxxxxxxxxxx

> / # <= ここからContainer内

補足

接続できない場合

ECS Exec Checkerを利用して接続確認すると便利
https://github.com/aws-containers/amazon-ecs-exec-checker

接続コードのsh

task_idを毎回調べるのは面倒なので、動的に取得するshを作成して利用しています

#!/bin/sh
# Amazon ECS ExecでECSコンテナに接続する
function usage() {
    echo
    echo "usage: ecs_exec.sh [-h] [cmd]"
    echo
    echo "options:"
    echo "  -h, --help    このメッセージを表示"
    echo
    echo "arguments:"
    echo "  cmd   実行したいコマンド。デフォルトは'/bin/sh'"
}

args=()
for option in "$@"; do
  case "${option}" in
    '-h' | '--help')
  usage
  exit 1
    ;;
  esac
done

ecs_task_id=`aws ecs list-tasks --cluster {cluster_name} | jq -r '.taskArns[0] | split("/") | .[2]'`

cmd="${1:-/bin/sh}"

aws ecs execute-command \
    --cluster {cluster_name} \
    --task "${ecs_task_id}" \
    --container {container_name} \
    --interactive \
    --command "${cmd}"
5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1