APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Amazon ECS の ECS Exec で詰まった話

はじめに

Amazon ECS に最近入門した、クラウド事業部の梅本です。

Docker や ベアメタルな Kubernetes は使っているのですが、クラウドなコンテナ環境に不慣れで今回の Amazon ECS についても四苦八苦しています。クラスタ?タスク定義?サービス?勉強ですね。

今回は Amazon ECS のロール周りで1つ詰まったので内容を共有したいと思います。

環境情報

  • 実行環境:CloudShell
    • aws コマンドの Session Manager Plugin がデフォルトで使えたので、こちらで今回作業しました。

やりたかったこと

ECS の練習もかねてコンテナを1つデプロイして、Webアプリを試しに使ってみようと思っていました。 試そうと思っていたのは ブラウザで使える VS Code。コンテナイメージも提供されていたのでポートを開放してサクッとデプロイして使おうと思っていました。

github.com

事象

クラスタやタスク定義など聞き慣れないリソースをWebからポチポチ作成し、コンテナは作成できました。Webアプリなのでブラウザからアクセスすると、パスワードが必要とのこと。

ログインする際のパスワードはコンテナ内に作成されたファイルに記載されているということが分かりました。よくある docker exec などを使ったコンテナへのアクセスが、ECSでも aws コマンドでアクセスできるとのことで早速コマンドを実行しますがアクセスできず・・・

$ aws ecs execute-command \
    --cluster t-ume \
    --task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --container cs \
    --interactive \
    --command "/bin/bash"

An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running. Wait and try again or run a new task with execute command enabled and try again.

アクセスするにはサービスの設定で ECS Exec 機能を有効化する必要がありました。

docs.aws.amazon.com

早速、サービスを更新するコマンドを使って、

$ aws ecs update-service \
    --cluster t-ume \
    --service t-ume \
    --enable-execute-command

An error occurred (InvalidParameterException) when calling the UpdateService operation: The service couldn't be updated because a valid taskRoleArn is not being used. Specify a valid task role in your task definition and try again.

今度はロール関連で何か問題がありそう。 ロールに追加のポリシーが必要だったので、

リンクまで貼って頂いてありがたい。リンク先で以下のポリシーをインラインで追加。

docs.aws.amazon.com

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

さて、今度こそ。

$ aws ecs update-service \
    --cluster t-ume \
    --service t-ume \
    --enable-execute-command

An error occurred (InvalidParameterException) when calling the UpdateService operation: The service couldn't be updated because a valid taskRoleArn is not being used. Specify a valid task role in your task definition and try again.

あれ。。。

解決方法

そこからクラスターが悪いのか、タスクが悪いのか、付与した権限が悪いのか・・・再作成を何度か試したなど2時間近く・・・

結論、問題は先ほどのスクリーンショットにありました。

ロールが2つあった・・・「タスク実行ロール」ではなく、「タスクロール」に上記のポリシーをあてたロールを指定する必要があったようです。

新しいロールを作るなど、以下作業で対応しました。

  1. 上記コードの許可ポリシーを作成
  2. 新たにロールを作成
    1. ユースケースの検索窓に「Elastic Container Service」を入力後、「Elastic Container Service Task」を選択
    2. 許可ポリシーに1で作ったポリシーを指定
  3. タスク定義で「新しいリビジョンの作成」で「タスクロール」に作成したロールを指定
  4. タスク定義が正常に更新されたのを確認し、タスク定義の「デプロイ」⇒「サービスを更新」でサービスを再デプロイ

再デプロイまで完了すると、やっと ECS Exec 機能を有効化することができました。

$ aws ecs update-service \
    --cluster t-ume \
    --service t-ume \
    --enable-execute-command

(結果が表示され、SpaceキーやEnterキーで先に送れる)

        "enableExecuteCommand": true  ★ここがTrueになっていればOK

元々行いたかったコンテナ内にターミナルでアクセスします。

※サービスの再デプロイの際に、タスクが再デプロイされIDが変更されているので注意

$ aws ecs execute-command \
    --cluster t-ume \
    --task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --container cs \
    --interactive \
    --command "/bin/bash"

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

An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running. Wait and try again or run a new task with execute command enabled and try again.

あれ・・・ドキュメントを再度確認すると、既存のタスクには適用されないようなので、タスクを一度「停止」⇒「サービスの更新」で再起動します。これでやっと・・・

docs.aws.amazon.com

既存のタスクに対して ECS Exec をオンにすることはできません。新しいタスクに対してのみオンにできます。

$ aws ecs execute-command \
    --cluster t-ume \
    --task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --container cs \
    --interactive \
    --command "/bin/bash"

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


Starting session with SessionId: ecs-execute-command-YYYY

root@XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX :/home/coder#
root@XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX :/home/coder#  cat /home/coder/.config/code-server/config.yaml 
bind-addr: 127.0.0.1:8080
auth: password
password: xxxxxxxxxxxxxxxx
cert: false

無事にログインすることもできました。

おわりに

私の調査不足もありましたが、この記事がどこかの誰かに役に立てば。

◆参考

docs.aws.amazon.com


APCはAWSセレクトティアサービスパートナー認定を受けております。

AWSセレクトティアサービスパートナー

その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

また、AWSの運用自動化ツールも展開しております。

www.ap-com.co.jp

一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 梅本
コンテナや k8s をメインにインフラ系のご支援を担当しています。
AWS は現在学び直し中! 普段は QiitaZenn に k8s を中心とした記事を投稿しております。よろしければ。