Amazon Web Services ブログ

AWS Copilot を使用して、AWS Fargate で実行されるコンテナのインタラクティブシェルに接続する

この記事は、Connecting to an interactive shell on your containers running in AWS Fargate using AWS Copilot を翻訳したものです。

2017 年に AWS Fargate をローンチしてから、多くの開発者の方がコンテナにサーバーレスコンピューティングモデルを採用しています。これらの開発者は、コンテナを実行するための EC2 インスタンスを管理する代わりに、コンテナサイズとコンテナの数の観点からスケーリングについて考えることができます。EC2 で実行可能なワークロードと同じものを AWS Fargate で実行できるように、AWS Fargate はローンチ以降も多くの機能拡張を実施してきました。それらの新機能の一つが “ECS exec” です。ECS exec では、コンテナに対してインタラクティブシェルを開くことができます。ECS exec のさらなる詳細については、ローンチブログを参照してください。

ECS の主要なゴールの一つは、あらゆる規模でお客様のニーズに応えることができるような基盤となる機能を備えた、パワフルな API を提供することです。また、API が使いやすくなるように、基盤となる API の上にユーザーフレンドリーなツールを構築しています。AWS Copilot もその一つで、ECS on Fargate におけるデベロッパーフレンドリーなコマンドラインのエクスペリエンスを提供します。AWS Copilot は、コンテナアプリケーションの構築、リリース、運用までのすべてのプロセスを通じて開発者をガイドします。AWS Copilot は、上記で紹介した “ECS exec” をすでにサポートしています。Copilot と ECS exec により、ローカルマシンから AWS Fargate のリモートコンテナに接続されたインタラクティブシェルを簡単に開くことができます。

インタラクティブシェルを開くことの難しさ

安全に接続を確立し、リモートマシンを制御することは困難です。まず第一に、別のマシンのリモート制御を可能にするプロトコルは、パブリックインターネット上の攻撃者が悪用しようとします。そのため、これらのプロトコルのセキュリティは、意図しない使用を防ぐために強化する必要があります。

加えて、セキュリティが重視される組織では、従業員のアクセスについても制限したいと考えるかもしれません。彼らは、開発者に一部の環境における一部のサービスに対してアクセスを許可する場合があります。しかし、パスワードなどの機密性の高い顧客情報を持つサービスに対しては、アクセスが制限されているはずです。エンジニアがシステムの一部にアクセスすることを許可されている場合、内部での悪用を防ぐために実行されたコマンドの監査可能なログが必要です。

もしインタラクティブシェルを開くことができれば、新しいパッケージのインストールやシステム設定の変更など様々な操作が可能となります。できれば、エンジニアはエフェメラルコンテナ自体にのみアクセスできることが望ましいです。コンテナに接続してその中でコマンドを実行した後、そのコンテナを完全に破棄してまだ触れていない新しいコンテナを実行することができます。この方法は、システムに永続的な変更を及ぼしません。

まとめると、解決すべきいくつかの課題があることが分かりました。パブリックインターネット上の攻撃者からインフラストラクチャを保護したいと考えています。エンジニアがアクセス可能な領域を制限し、実行されたコマンドの監査ログを生成したいとも考えています。そして、永続的な変更による長期的に続くドリフトを防ぎたいとも考えています。

ECS exec のご紹介

ECS exec は、先ほど説明したような困難な課題を解決します。この機能は AWS Systems Manager (SSM) の上に構築されています。ECS exec を有効にしたタスクを実行すると、タスクの起動時に SSM エージェントがコンテナ内に自動で追加されます。タスク用の IAM ロールが ECS exec を許可するように設定されている場合、このエージェントは SSM への接続を開くことができます。コンテナに接続する場合は、ローカルマシンの SSM Session Manager プラグインを実行して SSM サービスに接続し、そのサービスを経由して目的となるコンテナに接続できます。

これにより、アクセス制御の問題を適切に解決できます。パブリックインターネットからタスクへのダイレクトアクセスは存在せず、コンテナホストとなる EC2 または Fargate タスクはインバウンド接続を受け入れる必要が全くありません。代わりに、ローカルマシンから AWS SSM に接続すると、SSM はアプリケーションコンテナ自身が SSM に対して開いた接続を利用できます。

SSM が有効にされており SSM への接続を開くことができる IAM ロールを持つ、というタスクを制御することで、エンジニアがアクセス可能な領域を容易に狭めることができます。また、ローカルマシンから SSM に対して接続を開くことができる従業員を制御することもできます。これにより、すべてのタスクではなく、特定のタスクに接続するためのアクセス権を特定のエンジニアに付与することが非常に簡単になります。実行したコマンドは、すべて ECS タスクログに追加されるため、実行されたコマンドやそれらの出力を確認できます。

基盤となるコンテナホストに対する接続ではなく、エフェメラルコンテナに対する接続を確保することで、永続的な変更による問題は解決されます。インタラクティブシェルを使用して実行したコマンドはコンテナの中で実行されます。操作が完了すれば、コンテナを破棄して加えられた変更を消去できます。

ECS exec を機能させる基盤となるテクノロジについて詳しく知りたい場合は、パブリックコンテナロードマップにおけるこの機能のプロポーザルか、もしくは ECS API を使用してこの機能を手動で構成する方法について詳しく説明しているローンチブログを参照してください。

AWS Copilot で ECS exec が容易に

ECS exec をセキュアにするために様々なコンポーネントや IAM ロールがあります。ローカルの開発マシンにはクライアントサイドの要件があり、タスク定義にはサーバーサイドの要件があります。これらすべてを、適切に構成する必要があります。特に、コンテナ内でインタラクティブシェルを開始する簡単な方法を模索していると、これらを適切に構成することは難しい場合があります。これらの困難を解消するために、AWS Copilot は ECS exec をサポートしたバージョンを ECS exec のローンチに合わせてリリースしました。

AWS Copilot は、ECS exec を介したセキュアなアクセスのためにアプリケーションを自動で設定します。そのため、簡単な 1 ステップコマンドでアプリケーションコンテナに接続できます。ここでは、デベロッパーエクスペリエンスについて見ていきましょう。

まずは、簡単な NGINX のテスト用アプリケーションから始めます。

サービスがデプロイされたら、サービスのアドレスを取得できます。このサンプル Copilot アプリケーションでは、ブラウザにサービスのアドレスを入力するとデフォルトの NGINX ページが表示されます。

続いて、コンテナ内のシェルに接続し、このページのコンテンツを変更するために ECS exec を使用してみましょう。

必要なコマンドは copilot svc exec だけで、Copilot は自動的に AWS Fargate のコンテナに接続します。

必要に応じて、AWS Copilot は SSM Session Manager プラグインを自動でインストールできます。コマンド実行から数秒後、AWS Fargate で実行されるコンテナでシェルを開始します。ls と入力して、ファイルシステムの内容をリスト表示し、それらを確認できます。NGINX の構成を確認し、コンテナが提供している HTML ファイルを見つけることができます。

NGINX が提供する HTML ページを編集します。作業を簡単にするために、いくつかのコマンドを実行してコンテナ内にテキストエディタをインストールできます。

apt-get update
apt-get install vim
vim /usr/share/nginx/html/index.html

変更の適用後、ブラウザをリロードすることで HTML に追加したテキストが表示されるようになりました。

この変更は一時的なものです。Vim パッケージのインストールおよび HTML への変更は、実行中のコンテナのエフェメラルなファイルシステムにのみ存在しています。この実行中のコンテナを停止し新しいコンテナを起動した場合、サービスはコンテナイメージで定義されたオリジナルの状態に戻ります。Vim パッケージのインストールは存在せず、オリジナルの HTML コンテンツが再び表示されます。したがって、これは Web ページの HTML コンテンツを変更する最良の方法ではありません。ただし、ECS exec はデバッグコマンドを実行したり、実行中のコンテナの中で何が起こっているのか調査する必要があるようなその他のタスクを実行するための優れた方法です。

もう一つ、とても便利な機能を紹介します。copilot svc logs を実行すると、コンテナで発生したすべてのログを見ることができます。今回の例では、NGINX のアクセスログと ECS exec を介して実行したコマンド、およびそれらのコマンドの出力結果を得ることができます。

これにより、AWS Fargate で実行中のコンテナの中で実行したコマンドおよびその出力の、明確で監査可能な履歴が提供されます。

まとめ

ECS exec は、ECS on EC2 と ECS on Fargate のいずれにおいても、安全に接続を確立して実行中のコンテナの中でシェルを開始することができます。AWS Copilot を使用すると、ECS exec のエクスペリエンスはとてもシンプルです。1 つのコマンドで、Copilot が起動したコンテナにアクセスできます。

本投稿に関して、より詳細については以下を参照してください。

− デベロッパーアドボケイト Nathan Peck

翻訳はソリューションアーキテクト落水 (おちみず) が担当しました。