AWS Fargate タスクと別の AWS サービス間の接続に関する問題をトラブルシューティングしたいです。
簡単な説明
Amazon Elastic Container Service (Amazon ECS) の Fargate タスク内で実行されるアプリケーションは、次の原因で他の AWS サービスにアクセスできない場合があります。
- AWS Identity and Access Management (IAM) アクセス許可が十分ではない
- 不正なサブネットルート
- ネットワークアクセスコントロールリスト (ネットワーク ACL) の制限
- セキュリティグループのルールが誤っている
- Amazon Virtual Private Cloud (Amazon VPC) エンドポイントの設定が誤っている
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
ECS Exec を設定し、使用する
ECS Exec を使用して Fargate タスクのアプリケーションコンテナを操作します。ECS Exec を使用するための前提条件を満たしている必要があります。次に、Fargate タスクで ECS Exec を有効にします。
アプリケーションコンテナが ECS Exec を実行するためのシェルセッションをサポートしていない場合は、aws-cli Docker イメージを使用して新しい Fargate タスクを作成します。新しいタスクは、現在の Fargate タスクと同じサブネットと VPC に配置する必要があります。
Amazon ECS と他の AWS サービスエンドポイント間の接続を設定する
Amazon ECS タスクが他のサービスに接続できない場合は、次の条件を満たしていることを確認してください。
- エンドポイント URL が正確であり、プロトコル (**http://または ** https://)、ホスト名、ポートが含まれている。Amazon ECS サービスのサブネット設定に合ったサブネットを使用して VPC エンドポイントを設定します。
- Amazon ECS サービスが使用するサブネットには、エンドポイント URL (Amazon 提供 DNS またはカスタムリゾルバー) を解決するための適切な DNS 設定が必要です。
- Amazon ECS タスクにアタッチするセキュリティグループでは、宛先サービスのポートとプロトコルへのアウトバウンドアクセスを許可する必要があります。
- サブネット内のネットワークアクセスコントロールリスト (ACL) は、必要なサービスエンドポイントとの送受信トラフィックを許可する必要があります。
Fargate タスクと AWS サービスエンドポイント間の接続をテストする
Fargate タスクの AWS サービスエンドポイントとポートへの接続をテストするには、コンテナから次の telnet コマンドを実行します。
telnet endpoint-url port
注: 上記のコマンドで、endpoint-url をエンドポイントの実際の URL に、port をそのサービスのポート番号に置き換えます。
接続に成功すると、次のような出力が表示されます。
Trying 10.0.1.169...
Connected to sns.us-east-1.amazonaws.com.
Escape character is '^]'.
エンドポイントの DNS 解決をテストするには、次の nslookup コマンドを実行します。
nslookup example-endpoint
出力例:
Name: sns.us-east-1.amazonaws.com
Address: 10.0.1.169
telnet または nslookup コマンドをコンテナにインストール済みでない場合は、次のいずれかのコマンドを実行してインストールします。
Debian ベースのコンテナ:
apt-get update
apt-get install -y dnsutils telnet
Amazon Linux コンテナ:
yum install -y bind-utils telnet
接続タイムアウトエラーのトラブルシューティング
接続タイムアウトエラーが発生した場合は、ネットワーク構成を確認します。
セキュリティグループのルール
トラフィックが VPC エンドポイントを経由する場合、エンドポイントのセキュリティグループは次のいずれかからの TCP トラフィックをポート 443 で許可する必要があります。
- Amazon ECS タスクのセキュリティグループ
- VPC CIDR ブロック
タスクのセキュリティグループを、サービスの VPC エンドポイントへのアウトバウンドトラフィックを許可するように設定します。
VPC のルーティング
パブリックサブネットの場合、Fargate タスクにはインターネットゲートウェイを指すデフォルトルート 0.0.0.0/0 が必要です。
プライベートサブネットの場合、ルートテーブルには、アーキテクチャに応じて NAT ゲートウェイまたはトランジットゲートウェイへのルートが必要です。
プロキシ設定
Amazon ECS タスクでプロキシサーバーを使用する場合は、プロキシ設定でサービスエンドポイントへのトラフィックが許可する必要があります。
VPC フローログを分析する
接続の問題が解消されない場合は、Amazon VPC Flow Logs を使用してトラフィックフローの詳細を確認してください。
IAM アクセス許可に関する問題のトラブルシューティング
Amazon ECS タスクのロールが、他の AWS サービスと通信するためのアクセス許可をアプリケーションコンテナに付与しているかどうかを確認します。
たとえば、Amazon Simple Notification Service (Amazon SNS) エンドポイントに接続しようとすると、次のエラーが発生する場合があります。
VPC エンドポイントポリシーに関するエラーメッセージ例:
ListTopics 操作の呼び出し時にエラーが発生しました (AuthorizationError): ユーザー arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 は、次の実行を許可されていません: SNS:ListTopics on resource: arn:aws:sns:region-name:123456789012:* VPC エンドポイントポリシーで明示的に拒否されています
この問題を解決するには、Amazon VPC エンドポイントに AWS サービスに対して必要なアクションを実行するためのアクセス許可を付与します。上記のエラーメッセージ例では、Amazon VPC エンドポイントに ListTopics アクセス許可が必要です。
タスクロールのアクセス許可に関するエラーメッセージの例:
ListTopics 操作の呼び出し時にエラーが発生しました (AuthorizationError): ユーザー arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 は、次の実行を許可されていません: SNS:ListTopics (対象リソース: arn:aws:sns:region-name:123456789012:*) 理由: SNS:ListTopics アクションを許可する ID ベースのポリシーがありません
この問題を解決するには、Amazon ECS タスクの IAM ロールに、受信側のサービスに対して必要なアクションを実行するためのアクセス許可を付与します。上記のエラーメッセージ例では、IAM ロールに ListTopics アクセス許可が必要です。