メニュー
Amazon EC2 Container Service
開発者ガイド (API Version 2014-11-13)

タスク用の IAM ロール

Amazon ECS タスク用の IAM ロールを使用すると、タスクのコンテナで使用できる IAM ロールを指定できます。アプリケーションは AWS 認証情報で AWS API リクエストに署名する必要があります。この機能により、アプリケーションを使用するための認証情報を管理する戦略を利用できます。これは、Amazon EC2 インスタンスプロファイルが EC2 インスタンスに認証情報を提供する方法と似ています。AWS 認証情報を作成してコンテナに配布したり、EC2 インスタンスのロールを使用したりする代わりに、IAM ロールを ECS のタスク定義または RunTask API オペレーションに関連付けることができます。タスクのコンテナにあるアプリケーションは、AWS SDK または CLI を使用して権限付与された AWS のサービスへの API リクエストを実行できます。

重要

コンテナインスタンスで実行されているコンテナは (Amazon EC2 インスタンスメタデータサーバー経由で) コンテナインスタンスプロファイルに提供される認証情報にアクセスできません。コンテナインスタンスのロールのアクセス許可を、「Amazon ECS コンテナインスタンスの IAM ロール」に示されているアクセス許可の最小リストに制限することをお勧めします。

以下の iptables コマンドをコンテナインスタンスで実行することで、docker0 ブリッジのコンテナがコンテナインスタンスのプロファイルに指定されている認証情報にアクセスするのを防止できます (タスクロールで指定されているアクセスは引き続き許可します)。ただし、このルールが有効である間は、コンテナからインスタンスメタデータをクエリすることはできません。このコマンドはデフォルトの Docker のブリッジ構成を前提とし、host ネットワークモードを使用してコンテナで動作しないことに注意してください。詳細については、「ネットワークモード」を参照してください。

Copy
$ iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

タスク定義で使用する IAM ロールを定義するか、RunTask API オペレーションでタスクを手動で実行するときに taskRoleArn の上書きを使用できます。Amazon ECS エージェントは、ロール認証情報を含む追加のフィールドを使用してタスクを開始するペイロードメッセージを受け取ります。Amazon ECS エージェントは、タスクの UUID を識別トークンとして設定し、内部認証情報のキャッシュを更新して、タスクの識別トークンがペイロードで受け取ったロールの認証情報を指すようにします。Amazon ECS エージェントでは、次の相対 URI を使用して、このタスクに属するすべてのコンテナの Env オブジェクト (docker inspect container_id コマンドで利用可能) にAWS_CONTAINER_CREDENTIALS_RELATIVE_URI 環境変数を設定します。/credential_provider_version/credentials?id=task_UUID

注記

タスク用の IAM ロールを指定すると、そのタスクのコンテナ内の AWS CLI または他の SDK は、タスクロールによって提供された AWS 認証情報を排他的に使用し、コンテナインスタンスから IAM アクセス権限を継承しなくなります。

コンテナ内から、以下のコマンドを使用して認証情報をクエリできます。

Copy
[ec2-user ~]$ curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

出力:

{
    "AccessKeyId": "ACCESS_KEY_ID",
    "Expiration": "EXPIRATION_DATE",
    "RoleArn": "TASK_ROLE_ARN",
    "SecretAccessKey": "SECRET_ACCESS_KEY",
    "Token": "SECURITY_TOKEN_STRING"
}

コンテナインスタンスで、コンテナエージェントのバージョン 1.11.0 以降と、AWS CLI または SDK のサポートされているバージョンが使用されている場合、SDK クライアントによって、AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 変数が使用可能かどうかが確認され、提供された認証情報を使用して AWS API への呼び出しが実行されます。詳細については、「コンテナインスタンスでタスクの IAM ロールを有効にする」および「サポートされる AWS SDK の使用」を参照してください。

認証情報プロバイダーを使用するたびに、リクエストがローカルでホストコンテナインスタンスの /var/log/ecs/audit.log.YYYY-MM-DD-HH. 詳細については、「タスク認証情報の監査ログ用の IAM ロール」を参照してください。

タスク用の IAM ロールの利点

  • 認証情報の分離: コンテナは、コンテナが属するタスク定義で定義された IAM ロールの認証情報のみを取得できます。コンテナは、別のタスクに属する別のコンテナを対象にした認証情報にアクセスすることはありません。

  • 許可: 許可のないコンテナは別のタスク用に定義されている IAM ロール認証情報にアクセスできません。

  • 監査性: 遡及的な監査を確実に行うため、CloudTrail を介してアクセスとイベントのロギングを利用できます。タスクの認証情報には、セッションにアタッチされている taskArn のコンテキストがあるため、CloudTrail ログではどのタスクがどのロールを使用しているかを表示できます。

コンテナインスタンスでタスクの IAM ロールを有効にする

Amazon ECS コンテナインスタンスでは、タスクの IAM ロールを有効にするために、コンテナエージェントのバージョン 1.11.0 以上が必要ですが、最新のコンテナエージェントのバージョンを使用することをお勧めします。エージェントのバージョンの確認と最新バージョンへの更新については、「Amazon ECS コンテナエージェントの更新」を参照してください。Amazon ECS 対応 AMI を使用している場合、インスタンスでは、ecs-init パッケージの 1.11.0-1 以上が必要です。コンテナインスタンスがバージョン 2016.03.e 以降から起動される場合、コンテナエージェントおよび ecs-init の必要なバージョンが含まれます。詳細については、「Amazon ECS 対応 AMI」を参照してください。

コンテナインスタンスで Amazon ECS 対応 AMI を使用していない場合、必ず --net=host オプションを、エージェントを開始する docker run コマンドと、必要な構成に適切なエージェント設定変数に追加してください (詳細については、「Amazon ECS コンテナエージェントの設定」を参照してください):

ECS_ENABLE_TASK_IAM_ROLE=true

bridge および default ネットワークモードを使ったコンテナのタスクの IAM ロールを有効にします。

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

host ネットワークモードを使ったコンテナのタスクの IAM ロールを有効にします。この変数はエージェントバージョン 1.12.0 以降でのみサポートされています。

実行コマンドの例の詳細については、「Amazon ECS コンテナエージェントの手動更新 (Amazon ECS 対応 AMI 以外の場合)」を参照してください。また、タスクのコンテナが AWS 認証情報を取得できるよう、次のネットワーキングコマンドをコンテナインスタンスで設定する必要があります。

Copy
[ec2-user ~]$ sysctl -w net.ipv4.conf.all.route_localnet=1 [ec2-user ~]$ iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 [ec2-user ~]$ iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

タスク用の IAM ロールとポリシーの作成

タスクで使用する IAM ポリシーを作成して、タスクのコンテナに含めるアクセス許可を指定する必要があります。IAM の新しいアクセス許可ポリシーを作成する方法は複数あります。目的の操作のいくつかをすでに実行している完全な AWS 管理ポリシーをコピーし、特定の要件に応じてカスタマイズできます。詳細については、IAM ユーザーガイド の「新しいポリシーの作成」を参照してください。

また、タスク定義で指定する前に、使用するタスク用のロールを作成する必要があります。IAM コンソールで [Amazon EC2 Container Service Task Role] サービスロールを使用して、ロールを作成できます。それから、タスクのコンテナに必要なアクセス許可を付与するロールに特定の IAM ポリシーをアタッチできます。次の手順では、これを行う方法について説明します。

IAM のアクセス許可を必要とする複数のタスク定義またはサービスがある場合は、各タスクに提供するアクセスを最小限に抑えるために、タスクを操作するために必要な最小限のアクセス許可で特定のタスク定義またはサービスごとにロールを作成することを検討してください。

タスク用の IAM ポリシーを作成するには

この例では、Amazon S3 バケットへの読み取り専用アクセスを許可するポリシーを作成します。データベース認証情報または他の秘密情報をバケットに保存し、タスクのコンテナによってバケットからの認証情報の読み取りとアプリケーションへのロードを実行できます。

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. ナビゲーションペインで、[Policies] を選択し、[Create Policy] を選択します。

  3. [Create Policy] セクションで、[Select next to Create Your Own Policy] を選択します。

  4. [Policy Name] フィールドに、独自の一意の名前 (AmazonECSTaskS3BucketPolicy など) を入力します。

  5. [Policy Document] フィールドに、タスクに適用するポリシーを貼り付けます。以下の例では、my-task-secrets-bucket Amazon S3 バケットにアクセス許可を付与します。ポリシードキュメントを特定のニーズに応じて変更できます。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1465589882000", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-task-secrets-bucket/*" ] } ] }
  6. [Create Policy] を選択して終了します。

タスク用の IAM ロールを作成するには

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. ナビゲーションペインで [Roles] を選択し、続いて [Create New Role] を選択します。

  3. [Role Name] フィールドに、ロールの名前を入力します。この例では、ロールの名前を AmazonECSTaskS3BucketRole と入力し、[Next Step] を選択します。

  4. [Select Role Type] セクションで、[Amazon EC2 Container Service Task Role] サービスロールの横にある [Select] を選択します。

  5. [Attach Policy] セクションで、タスクで使用するポリシーを選択します (この例では AmazonECSTaskS3BucketPolicy を選択し、[Next Step] を選択します)。

  6. ロール情報を確認し、[Create Role] を選択して終了します。

サポートされる AWS SDK の使用

2016 年 7 月 13 日に、タスク用の IAM ロールのサポートが AWS SDK に追加されました。そのため、タスクのコンテナでは、その日付以降に作成された AWS SDK バージョンを使用する必要があります。Linux ディストリビューションのパッケージマネージャに含まれている AWS SDK は、この機能をサポートするのに十分なほど新しくない可能性があります。

サポートされている SDK を使用していることを確認するには、コンテナを構築する際に、「アマゾン ウェブ サービスのツール」で、希望する SDK のインストール手順に従ってください。

次に示す AWS SDK バージョン以降で、タスク用の IAM ロールがサポートされています。

  • AWS CLI: 1.10.47

  • C++: 0.12.19

  • CoreCLR: 3.2.6-beta

  • Go: 1.2.5

  • Java: 1.11.16

  • .NET: 3.1.6

  • Node.js: 2.4.7

  • PHP: 3.18.28

  • Python (botocore): 1.4.37

  • Python (Boto3): 1.4.0

    注記

    botocore モジュールでは、Boto3 の 低レベルのコア機能を提供しており、Boto3 の各バージョンはさまざまな botocore モジュールバージョンをサポートしています。タスク用の IAM ロール の Boto3 サポートでは、基盤となる botocore モジュールが、上記で示した最小バージョン以降であることを確認する必要があります。

  • Ruby: 2.3.22

タスク用の IAM ロールを指定する

ロールを作成し、そのロールにポリシーをアタッチした後、そのロールを引き受けるタスクを実行できます。これには複数の方法があります。

  • タスク定義でタスク用の IAM ロールを指定します。新しいタスク定義または既存のタスク定義の新しいリビジョンを作成して、前に作成したロールを指定できます。コンソールを使用してタスク定義を作成する場合、[Task Role] フィールドで IAM ロールを選択します。AWS CLI または SDK を使用する場合、taskRoleArn パラメーターを使用してタスクロールの ARN を指定します。詳細については、「タスク定義の作成」を参照してください。

    注記

    このオプションは、Amazon ECS サービスで IAM のタスクロールを使用する場合に必要です。

  • タスクを実行する際に、IAM タスクロールの上書きを指定します。タスクを実行する際に IAM タスクロールの上書きを指定できます。コンソールを使用してタスクを実行する場合、[Advanced Options] を選択し、[Task Role] フィールドで IAM ロールを選択します。AWS CLI または SDK を使用する場合、overrides JSON オブジェクトの taskRoleArn パラメーターを使用してタスクロールの ARN を指定します。詳細については、「タスクの実行」を参照してください。

注記

タスクおよびサービスを実行するために必要な標準の Amazon ECS アクセス権限を付与するだけでなく、IAM ユーザーにはタスクの IAM ロールを使用する iam:PassRole アクセス権限も必要です。