今までECS/Fargateの場合、「コンテナにSSHする」という概念がそもそもNGと言われていましたが、私の経験上デバッグするのに結局SSHでログインしないと原因不明といったことがありました。なのでわざわざDockerfileにopenssh-serverをインストールして、鍵の設定をしてなどと…(以下ブログより)

さらにセッションマネージャーを用いることでログインすることはできますが、非公式ということもあり、結局SSHを開けてデバッグをするという流れになりました。

というわけで待望のECS Execがリリースしまして、AWS Systems Managerのセッションマネージャーを使い、SSMエージェント経由でコンテナへのアクセスが可能になりました。これでSSHのポートも開ける必要がなくなったのでセキュアにもなります。というわけで試してみました!

[Amazon ECS]AWS FargateでSSHコンテナを動かしてみた


ECS Execとは

https://aws.amazon.com/jp/about-aws/whats-new/2021/03/amazon-ecs-now-allows-you-to-execute-commands-in-a-container-running-on-amazon-ec2-or-aws-fargate/

ECS Exec では、ホストインスタンスとやり取りしたり、インバウンドポートを開いたり、SSH キーを管理したりすることなく、実行中のコンテナと直接やり取りができるため、コンテナインスタンスのセキュリティ体制が向上します。この機能を ECS タスクやサービスなどのきめ細かいレベルで有効にして、より厳密なセキュリティを維持するのに役立てることができます。AWS Identity and Access Management (IAM) ポリシーを使用すると、きめ細かいポリシーを作成して、クラスター、タスク、コンテナに対してコマンドを実行できるユーザーを制御することができます。アクセスが提供されると、AWS CloudTrail を使用してコンテナにアクセスしたユーザーを監査し、Amazon Simple Storage Service (Amazon S3) または Amazon CloudWatch Logs に出力して各コマンドをログに記録することができます。これにより、ECS ユーザーは、開発中に発生したバグやシステムの問題を安全にトラブルシューティングでき、コンテナ化されたアプリケーションの本番環境でのブレークグラス手順のデバッグツールを利用できます


AppコンテナにECS Execログインするまで

  • Fargateのバージョンは1.4.0必須
  • 事前にログインするIAMユーザーのecs-execute-commandポリシーを作成と手動でアタッチ
  • ecs-exec用のIAMポリシーを作成し、ecsTaskExecutionRoleに追加

iam.tf

adachin-ecs-exec.json

adachin-ecs-execute-command.json

ログインするIAMユーザーにアタッチすること。

今回Terraform化していますが、実際に既存で動作しているAppコンテナのRoleに対して、ecs-exec用のIAMポリシーを新たに追加しました。

  • AWS CLI v2とsession-manager-pluginのインストール

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-linux

今回はAmazon Linux 2で上記インストールしてみました。MacやWindowsでもSession Manager pluginはインストールできます。

  • 対象のAppコンテナへECS Execを有効化

対象のAppコンテナへECS Execを有効化しないとログインできないので注意!

  • Terraformの aws_ecs_service resourceに以下を追加

差分が出るので追加しましょう。

  • Appコンテナをデプロイする

ECS Execを有効化しただけではログインできません。必ずコンテナをデプロイ/タスク定義の更新をしてローリングアップデートしましょう。私はここでくそハマりました… 以下助けてくれてありがとう!!

  • ログインしてみる


シェルスクリプトで簡単ログイン

  • ecs-exec.sh

  • login

タスクIDを抽出してsedで削るという非常にシェル芸ですが、もっと簡単にログインできる方法あれば教えて下さい!!


※追記

https://github.com/kayac/ecspresso

https://github.com/peco/peco

カヤックの藤原さんが作られた ecspresso で、結構前にv1.5.0でexecコマンドが対応したのでこれを使うのがベストです!pecoと連携もできるし、シェル芸する労力ないのと各yamlファイルでコンテナの管理ができるので最高です!

  • クレデンシャルの環境変数追加

  • app.yaml作成

  • コンテナログイン

 ※ちなみに上記だと毎回環境変数とecspressoを実行するのが手間なので、pecoを組み合わせると便利になります。

  • .zshrc

  • /etc/ecspresso/adachin/hosts

  • ログイン


まとめ

素晴らしい!!これでSSH開けることなくコンテナにログインすることができるようになりました!それにログ等はCloudTrailやCloudWatch Logsに管理されるので、踏み台サーバーも今後は必要なさそうな…懸念点としてはオートスケール時に、コンテナデバッグ中で古いコンテナから消えるのでセッションが切れたらログインし直すことになるのだろうけど、基本ログインしないからいいか…


カテゴリー: AWSDockerECS/Fargate

adachin

1989年生まれのFindy/SRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWSでのインフラ構築、Docker開発環境の提供、IaC、新技術の検証、リファクタリング、セキュリティ強化、分析基盤の運用などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTA/TechBullで未経験者にインフラのコーチング/コミュニティマネージャーとして立ち上げと運営をしている。また、過去「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください