アプリケーションが AWS API コールを実行したときに表示される「Access Denied」(アクセス拒否) というエラーメッセージを解決するように Amazon ECS で IAM タスクロールを設定する方法。
簡単な説明
IAM タスクロールを正しく設定していないと、アプリケーションが AWS API を呼び出したときに「アクセス拒否」のエラーメッセージが表示される場合があります。
このエラーを発生させないようにするには、Amazon Elastic Container Service (Amazon ECS) のタスク定義で AWS Identity and Access Management (IAM) のタスクロールを指定します。自分のタスクで、この IAM ロールを AWS API の呼び出しに使用できます。IAM タスクロールには、アプリケーションが必要とするすべての許可が付与されている必要があります。設定上の問題でタスクが IAM タスクロールを見つけられない場合は、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスロールが使用されます。
解決方法
タスクの IAM ロールを正しく設定するには、以下を確認します。
ECS コンテナエージェントが実行されていることを確認します
ECS コンテナエージェントが実行されていることを確認するには、次のコマンドを実行します。
docker ps
IAM ロールを ECS コンテナエージェントの設定ファイルでオンにする
1. /etc/ecs/ecs.config ファイルを開きます。
2. コンテナのタスク用の IAM ロールを bridge および default ネットワークモードでオンにするには、ECS_ENABLE_TASK_IAM_ROLE を [true] に設定します。次の例を参照してください。
ECS_ENABLE_TASK_IAM_ROLE=true
3. コンテナのタスク用の IAM ロールを host ネットワークモードでオンにするには、ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST を [true] に設定します。次の例を参照してください。
ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
4. 設定ファイルを更新するには、次のいずれかのコマンドを実行して AECS コンテナエージェントを再起動します。
Amazon ECS に最適化された Amazon Linux AMI の場合:
sudo stop ecs
sudo start ecs
Amazon ECS に最適化された Amazon Linux 2 AMI の場合:
sudo systemctl restart ecs
IAM ポリシーが Amazon ECS タスクと正しい信頼関係にあることを確認します
IAM ロールが正しい信頼関係を持っていることを確認するには、以下の通りに IAM ポリシーを更新します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ECS コンテナエージェントのプロキシ設定を確認する
Amazon ECS コンテナエージェントの設定で HTTP_PROXY を使用している場合は、次の NO_PROXY 設定 を適用します。
NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock
正しい AWS SDK を使用していることを確認する
コンテナで実行されているアプリケーションは、AWS SDK の 2016 年 7 月以降のバージョンを使用している必要があります。
AWS SDK を更新するには、「AWS での構築ツール」を参照してください。
Amazon ECS 向けに最適化されていない AMI の要件を満たす
Amazon ECS に最適化されていない AMI を使用している場合は、iptables に必要なルールを設定します。
注: インスタンスを再起動すると、iptables のルールがデフォルトにリセットされます。リセットを回避するには、次のいずれかのコマンドを実行してルールを保存します。
Amazon ECS に最適化された Amazon Linux AMI の場合:
sudo service iptables save
Amazon ECS に最適化された Amazon Linux 2 AMI の場合:
sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
非 PID 1 プロセスで使用可能な認証情報のパスの環境変数を作成します
環境変数 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI を使用できるのは、コンテナ内の PID 1 プロセスのみです。コンテナで複数のプロセスまたは init プロセス (ラッパースクリプト、start スクリプト、supervisord など) を実行している場合、この環境変数を非 PID 1 プロセスで使用することはできません。
非 PID 1 プロセスでも使用できるように環境変数を設定するには、この環境変数を .profile ファイルにエクスポートします。たとえば、次のコマンドを実行して、コンテナイメージの Dockerfile に変数をエクスポートします。
RUN echo 'export $(strings /proc/1/environ | grep AWS_CONTAINER_CREDENTIALS_RELATIVE_URI)' >> /root/.profile
これで、追加のプロセスが環境変数にアクセスできるようになります。
注: 環境変数をエクスポートするときは文字列と grep コマンドに依存します。
関連情報
タスク用の IAM ロールのトラブルシューティング
タスク用の Windows IAM ロールの追加設定