Amazon Elastic Container Service (Amazon ECS) で AWS Identity and Access Management (IAM) タスクロールを構成し、API コールを行う際の "Access Denied" エラーを防ぎたいと考えています。
簡単な説明
Access Denied エラーの発生を防ぐには、Amazon ECS のタスク定義に IAM ロールを含めます。
ECS コンテナエージェント構成ファイルで IAM ロールを有効にする必要があります。また、IAM ロールには、タスクがロールを使用し、API コールを行うために必要な権限がすべて含まれていることを確認してください。
注: 構成に問題があり、タスクが IAM タスクロールを見つけられない場合、そのタスクは Amazon Elastic Compute Cloud (Amazon EC2) インスタンスロールを使用します。
解決策
ECS コンテナエージェントが実行中であることを確認する
docker ps コマンドを実行します。
docker ps
注: インスタンスを再起動した場合、iptables のルールはデフォルトにリセットされます。リセットされないようにするには、次のいずれかのコマンドを実行してルールを保存します。
Amazon ECS 最適化 Amazon Linux Amazon マシンイメージ (AMI):
sudo service iptables save
Amazon ECS 最適化 Amazon Linux 2 AMI:
sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
ECS コンテナエージェント構成ファイルで IAM ロールを有効にする
次の手順を実行します。
-
/etc/ecs/ecs.config ファイルを開きます。
-
bridge または default のネットワークモードにおいて、コンテナ内のタスクで IAM ロールを有効にするには、ECS_ENABLE_TASK_IAM_ROLE を true に設定します。
ECS_ENABLE_TASK_IAM_ROLE=true
-
host ネットワークモードにおいて、コンテナ内のタスクで IAM ロールを有効にするには、ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST を true に設定します。
ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
構成ファイルを更新するには、次のいずれかのコマンドを実行して ECS コンテナエージェントを再起動します。
Amazon ECS 最適化 Amazon Linux AMI:
sudo stop ecs
sudo start ecs
Amazon ECS 最適化 Amazon Linux 2 AMI:
sudo systemctl restart ecs
IAM ロールの信頼ポリシーを更新する
IAM ロールを Amazon ECS タスクに割り当てるには、IAM ロールの信頼ポリシーを更新します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ECS コンテナエージェントの HTTP_PROXY 設定を更新する
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 以降を使用する必要があります。AWS の更新方法については、「AWS SDK とツールのバージョンサポート」および「AWS における構築用ツール」を参照してください。
Amazon ECS 最適化が行われていない AMI で iptables ルールを構成する
Amazon ECS 最適化が行われていない AMI を使用する場合は、iptables に必要なルールを設定してください。
環境変数を PID 1 以外のプロセスで利用できるようにする
環境変数 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI は、コンテナ内の PID 1 プロセスでのみ使用できます。コンテナが複数のプロセスまたは init プロセスを実行している場合、この環境変数は PID 1 以外のプロセスでは使用できません。
環境変数を PID 1 以外のプロセスで使用できるよう設定するには、その環境変数を .profile ファイルにエクスポートします。たとえば、次のコマンドを実行し、コンテナイメージの Dockerfile 内の環境変数をエクスポートします。
RUN echo 'export $(strings /proc/1/environ | grep AWS_CONTAINER_CREDENTIALS_RELATIVE_URI)' >> /root/.profile
注: 環境変数をエクスポートする際、文字列と grep コマンドに対する依存関係が発生します。
関連情報
Amazon EC2 Windows インスタンスの追加設定