Amazon Elastic Container Service (Amazon ECS) タスクから Amazon Simple Storage Service (Amazon S3) にアクセスしたいのですが、接続の問題が発生しています。
解決策
CloudWatch Logs を分析して Amazon S3 へのアクセスに関する問題の原因を特定する
まず、CloudWatch Logs へのアクセスを設定します。次に、CloudWatch Logs Insights を使用して問題の原因を特定します。
CloudWatch Logs へのアクセスを設定する
Amazon ECS タスク定義用に Amazon CloudWatch Logs を設定するには、次の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで [タスク定義] を選択します。
- タスク定義を選択し、次のコードをタスク定義に追加します。
{
"containerDefinitions": [
{
"name": "my-container",
"image": "my-image:latest",
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/my-task",
"awslogs-region": "region-code",
"awslogs-stream-prefix": "ecs"
}
}
}
]
}
注: お使いのものでそれぞれ、my-container をコンテナインスタンスの名前に、my-image:latest をイメージ名とタグに、region-code を AWS リージョンに置き換えます。
- Amazon ECS サービスを更新し、タスク定義の最新バージョンを使用します。
CloudWatch Logs Insights を使用して問題の原因を特定する
一般的な Amazon S3 エラーを検索するには、次のクエリを実行します。
filter @message like /S3|AccessDenied|NoSuchBucket/
特定のバケットへのアクセスの問題を検索するには、次のクエリを実行します。
filter @message like /my-bucket-name/
注: my-bucket-name を該当するバケット名に置き換えます。
この情報を参考に、問題が AWS Identity and Access Management (IAM) のアクセス許可、ネットワーク接続、バケット設定、アプリケーションの問題に関係しているかどうかを判断します。次に、関連するトラブルシューティング手順を実行します。
IAM ロールの設定を確認する
Amazon ECS タスクのタスクロールに、読み取り専用操作用の AmazonS3ReadOnlyAccess ポリシーなど、必要な Amazon S3 アクセス許可があることを確認します。AWS CloudTrail ログを確認し、Amazon S3 に関連する拒否されたアクションを特定します。たとえば、Amazon ECS タスクが my-app-data バケットからオブジェクトを読み取る必要がある場合は、次のカスタムポリシーをタスクにアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-data",
"arn:aws:s3:::my-app-data/*"
]
}
]
}
注: 上記のポリシーを使用すると、タスクが my-app-data バケットのコンテンツを一覧表示したり、オブジェクトを取得したりすることができます。
ネットワーク設定を確認する
パブリックサブネット内のタスク
パブリックサブネットのタスクにおいて、インスタンスが置かれている仮想プライベートクラウド (VPC) のネットワークアクセスコントロールリスト (ネットワーク ACL) を確認します。ネットワーク ACL はポート 443 でのアウトバウンドトラフィックを許可する必要があります。さらに、タスクに関連付けられたセキュリティグループが、Amazon S3 の AWS マネージドプレフィックスリストへのアウトバウンド HTTPS トラフィックをポート 443 で許可していることを確認します。
プライベートサブネット内のタスク
プライベートサブネットのタスクでは、NAT ゲートウェイがサブネットのルートテーブルに関連付けられていることを確認します。NAT ゲートウェイは Amazon S3 エンドポイントに到達するためのインターネットパスを作成します。Amazon S3 の VPC エンドポイントを使用している場合は、Amazon S3 ゲートウェイのエンドポイントで、VPC に関連付けられたルートテーブルを確認します。ルートテーブルに、Amazon S3 ゲートウェイのエンドポイントにトラフィックを転送する Amazon S3 AWS マネージドプレフィックスリスト用のルートが含まれていることを確認します。このルートは、Amazon S3 へのリクエストがパブリックインターネット経由で送信されることを防ぎます。
Amazon S3 インターフェイスエンドポイントの使用時には、エンドポイントにアタッチされているセキュリティグループがポート 443 でインバウンド HTTPS トラフィックを許可していることを確認してください。さらに、エンドポイントのプライベート DNS 設定および、VPC で DNS 設定 [DNS ホスト名を有効にする] と [DNS サポートを有効にする] が有効であることを確認します。最後に、アプリケーションがグローバルエンドポイント s3.amazonaws.com ではなく、エンドポイント s3.region.amazonaws.com を使用していることを確認します。
Amazon ECS タスクから Amazon S3 エンドポイントへのネットワーク接続をテストする
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
ファイアウォールやセキュリティグループなどのネットワーク設定で Amazon S3 エンドポイントへのトラフィックが許可されていることを確認します。
注: ECS Exec を使用して次のコマンドを実行します。
ポート 443 での Amazon S3 エンドポイントへの HTTPS 接続をテストするには、次の telnet または curl コマンドを実行します。
telnet s3.region-code.amazonaws.com 443
curl -v https://s3.region-code.amazonaws.com
注: region-code をお使いのリージョンに置き換えます。telnet コマンドのインストールが必要な場合があります。
AWS CLI コマンド ls を実行し、コンテナインスタンスが Amazon S3 の操作を認証して実行できるかどうかをテストします。
aws s3 ls
前のテストにパスできなかった場合は、セキュリティグループ、ネットワーク ACL、およびファイアウォールルールをレビューし、ブロックされているポートについて確認してください。
関連情報
Amazon S3 が返す "403 access denied" エラーのトラブルシューティング方法を教えてください
Fargate 上の Amazon ECS タスクから他の AWS サービスにアクセスする方法を教えてください
Amazon S3 バケットでコマンド "cp" または を実行する際の接続エラーをトラブルシューティングする方法を教えてください"sync"