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_ROLEtrue に設定します。次の例をご参照ください。

ECS_ENABLE_TASK_IAM_ROLE=true

3.    コンテナのタスク用の IAM ロールを host ネットワークモードで有効化するには、ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOSTtrue に設定します。次の例をご参照ください。

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 コマンドに依存します。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合