Amazon ECS で "アクセス拒否" エラーを発生させないように IAM タスクロールを設定する方法を教えてください。
最終更新日: 2019 年 7 月 16 日
アプリケーションが AWS API を呼び出したとき、"アクセス拒否" のエラーメッセージが表示されましした。このエラーの解決方法を教えてください。
簡単な説明
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 コマンドに依存します。