Amazon AppStream 2.0がIAMロールに対応しました

Amazon AppStream 2.0が

  • Image Builder(イメージの作成に使用する仮想マシン)
  • フリートリソース(ストリーミングインスタンス)

でIAMロールを使用出来るようになりました。

IAM ロールを使用すると、永続的な認証情報を配布せずに、一時的な認証情報でAWSリソースを操作出来ます。

この機能により、イメージ作成時にプライベートなS3バケットからアーカイブをダウンロードしたり、AWS CLI の実行環境を AppStream 2.0 で提供するといったことを、よりセキュアに行えるようになります。

IAM ロールの使用方法

IAM ロールの作成

appstream.amazonaws.com が AssumeRole できる IAM ロールを作成します。

Trust relationships を次のように定義します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "appstream.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Image Builderで使用

新規イメージローンチ時に、「Step 2: Configure Image Builder」「IAM role(Advanced)」で作成した IAM ロールを設定します。

フリートで使用

フリート作成時に、「Step 3: Configure Fleet」「IAM role(Advanced)」で作成した IAM ロールを設定します。

IAM ロールを使用した API の操作方法

IAM ロールを割り当てると、CLI/SDK の設定ファイルにプロフィール appstream_machine_role が定義されます。

C:>type C:\Users\PhotonUser\.aws\config
[profile appstream_machine_role]
credential_process = "C:\Program Files\Amazon\Photon\PhotonRoleCredentialProvider\PhotonRoleCredentialProvider.exe" --role=Machine

credential_process を利用して、クレデンシャルを取得していますね。

API 実行時に、このプロフィールを指定すれば OK です。

AWS CLI から操作

C:\> aws s3 ls --profile appstream_machine_role

AWS Tools for PowerShell から操作

PS C:\> Get-EC2Instance -Region us-east-1 -ProfileName appstream_machine_role

Python SDK から操作

session = boto3.Session(profile_name='appstream_machine_role')

CloudTrail ログ

ストリーミングインスタンス内の AWS CLI から S3 の list-buckets API を実行したときの CloudTrail ログが以下です。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "XXX:PhotonSession",
        "arn": "arn:aws:sts::123456789012:assumed-role/AmazonAppStreamServiceAccess/PhotonSession",
        "accountId": "123456789012",
        "accessKeyId": "DUMMY",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2019-09-25T17:08:03Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "XXX",
                "arn": "arn:aws:iam::123456789012:role/service-role/AmazonAppStreamServiceAccess",
                "accountId": "123456789012",
                "userName": "AmazonAppStreamServiceAccess"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2019-09-25T17:08:03Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "ListBuckets",
    "awsRegion": "eu-central-1",
    "sourceIPAddress": "172.18.165.74",
    "userAgent": "[aws-internal/3 aws-sdk-java/1.11.631 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.222-b10 java/1.8.0_222 vendor/Oracle_Corporation]",
    "requestParameters": {
        "host": [
            "s3-eu-central-1.amazonaws.com"
        ]
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV4",
        "CipherSuite": "ECDHE-RSA-AES128-SHA",
        "AuthenticationMethod": "AuthHeader",
        "vpcEndpointId": "vpce-1234"
    },
    "requestID": "201681E4CE37A63C",
    "eventID": "f67ab1d4-4fdf-40ca-9584-ad60e6568d17",
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012",
    "vpcEndpointId": "vpce-1234"
}

参考