AWS CLI を使用して IAM ロールを引き受ける方法を教えてください。

最終更新日: 2020 年 5 月 15 日

AWS Command Line Interface (AWS CLI) を使用して AWS Identity and Access Management (IAM) ロールを引き受けたいと思います。どうすればできますか?

解決方法

AWS CLI を使用して IAM ロールを引き受けるには、以下の手順に従ってください。この例では、これらのステップを実行した後、ユーザーは Amazon Elastic Compute Cloud (Amazon EC2) インスタンスへの読み取り専用アクセス権と、IAM ロールを引き受ける権限を持ちます。

ロールを引き受ける権限を持つ IAM ユーザーを作成する

1.    AWS CLI を使用して IAM ユーザーを作成します。

注 : Bob を使用している IAM ユーザー名に置き換えてください。

aws iam create-user --user-name Bob

2.    AWS CLI を使用して Bob に権限を付与する IAM ポリシーを作成します。お好みのテキストエディタを使用して、IAM ポリシーを定義する JSON ファイルを作成する必要があります。この例では、Linux で一般的に使用されている vim を使用します。

注 : を自分のポリシー名、ユーザー名、ロール、JSON ファイル名、プロファイル名、およびキーに置き換えます。

vim example-policy.json

3.    example-policy.json ファイルの内容は次のようになるはずです。  

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "iam:ListRoles",
                "sts:AssumeRole"
            ],
            "Resource": "*"
        }
    ]
}

IAM ポリシーの作成の詳細については、「IAM ポリシーの作成」、「IAM ID ベースのポリシーの例」、および「 IAM JSON ポリシーリファレンス」を参照してください。

IAM ポリシーの作成

1.    aws iam create-policy コマンドを使用します。

aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json

aws iam create-policy コマンドは、IAM ポリシーの ARN (Amazon Resource Name) など、いくつかの情報を出力します。

arn:aws:iam::123456789012:policy/example-policy

注: 123456789012 を自分のアカウントに置き換えてください。

2.    出力から IAM ポリシー ARN を書き留め、attach-user-policy コマンドを使用してポリシーを Bob にアタッチします。次に、以下のように、list-attached-user-policies を使用して、添付ファイルが正しい場所にあることを確認します。

aws iam attach-user-policy --user-name Bob --policy-arn "arn:aws:iam::123456789012:policy/example-policy"
aws iam list-attached-user-policies --user-name Bob

IAM ロールの信頼関係を定義する JSON ファイルを作成する

1.    次のように、信頼関係を定義する JSON ファイルを作成します。  

vim example-role-trust-policy.json

2.    example-role-trust-policy.json ファイルの内容は次のようになるはずです。

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
        "Action": "sts:AssumeRole"
    }
}

特定の IAM ユーザーのみが IAM ロールを引き受けることができるように信頼関係を制限することもできます。これを行うには、arn:aws:iam::123456789012:user/example-username のようにプリンシパルを指定します。詳細については、「AWS JSON のポリシー要素 : プリンシパル」を参照してください。

IAM ロールを作成し、ポリシーをアタッチする

Amazon Relational Database Service (Amazon RDS) インスタンスへの読み取り専用アクセス権を持つ Bob が引き受けることができる IAM ロールを作成します。この IAM ロールは IAM ユーザーが引き受けるため、IAM ユーザーがそのロールを引き受けることを許可するプリンシパルを指定する必要があります。たとえば、arn:aws:iam::123456789012:root のようなプリンシパルでは、アカウントのすべての IAM ID でそのロールを引き受けることができます。詳細については、「IAM ユーザーに権限を委任するロールの作成」を参照してください。

1.    Amazon RDS DB インスタンスへの読み取り専用アクセス権を持つ IAM ロールを作成します。セキュリティ要件に従って、IAM ポリシーを IAM ロールに関連付けます。

aws iam create-role コマンドは、IAM ロールを作成し、JSON ファイルの内容に従って信頼関係を定義します。aws iam attach-role-policy コマンドは AWS 管理ポリシー AmazonRDSReadOnlyAccess をロールにアタッチします。セキュリティ要件に応じて、異なるポリシー (管理ポリシーとカスタムポリシー) をアタッチできます。aws iam list-attached-role-policies コマンドは、IAM ロール example-role にアタッチされている IAM ポリシーを表示します。

aws iam create-role --role-name example-role --assume-role-policy-document file://example-role-trust-policy.json
aws iam attach-role-policy --role-name example-role --policy-arn "arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess"
aws iam list-attached-role-policies --role-name example-role

注: Bob が EC2 インスタンスへの読み取り専用アクセスを付与されていて、それが example-role を引き受けることができるかを確認します。

2.    次のコマンドを使用して Bob のアクセスキーを作成します。

aws iam create-access-key --user-name Bob

AWS CLI コマンドは、アクセスキー ID とシークレットアクセスキーを出力します。必ずこれらのキーをメモしてください。

アクセスキーを設定する

1.    アクセスキーを設定するには、デフォルトプロファイルまたは特定のプロファイルを使用します。デフォルトプロファイルを設定するには、aws configure を実行します。新しい特定のプロファイルを作成するには、aws configure --profile example-profile-name を実行します。この例では、次のようにデフォルトプロファイルが設定されています。

aws configure
AWS Access Key ID [None]: ExampleAccessKeyID1
AWS Secret Access Key [None]: ExampleSecretKey1
Default region name [None]: eu-west-1
Default output format [None]: json

注 : [デフォルトのリージョン名] には、AWS リージョンを指定してください。

AWS CLI コマンドが呼び出され、IAM ユーザーアクセス権があることを確認する

1.    次のように aws sts get-caller-identity コマンドを実行します。

aws sts get-caller-identity

aws sts get-caller-identity コマンドは、ARN を含む 3 つの情報を出力します。出力は arn:aws:iam::123456789012:user/Bob のように表示されます。これにより、AWS CLI コマンドが Bob として呼び出されたことを確認できます。

2.    次のコマンドを実行して、IAM ユーザーが EC2 インスタンスへの読み取り専用アクセス権を持ち、Amazon RDS DB インスタンスへのアクセス権を持っていないことを確認します。

aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]"
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"

aws ec2 describe-instances コマンドを実行すると、eu-west-1 リージョンにあるすべての EC2 インスタンスが表示されるはずです。Bob は Amazon RDS にアクセスできないため、aws rds describe-db-instances コマンドはアクセス拒否エラーメッセージを必ず生成します。

IAM ロールを引き受ける

1.    このコマンドを実行して、ロールの ARN を取得します。

aws iam list-roles --query "Roles[?RoleName == 'example-role'].[RoleName, Arn]"

2.    このコマンドは IAM ロールを一覧表示しますが、ロール名で出力をフィルターします。IAM ロールを引き受けるには、次のコマンドを実行します。

aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session

AWS CLI コマンドはいくつかの情報を出力します。認証情報ブロックの中には、AccessKeyIdSecretAccessKey、および SessionToken が必要です。この例では、環境変数 RoleAccessKeyIDRoleSecretKeyRoleSessionToken を使用します。有効期限フィールドのタイムスタンプを書き留めます。これは UTC タイムゾーンであり、IAM ロールの一時的な認証情報が期限切れになる時期を示しています。一時的な認証情報が期限切れになった場合は、もう一度 sts:AssumeRole API コールを呼び出す必要があります。

注: DurationSeconds パラメータを使用して、IAM ロールの一時的な認証情報の最大セッション期間の有効期限を伸ばすことができます。

IAM ロールを引き受け、アクセスを確認するための環境変数を作成する

1.    IAM ロールを引き受けるために 3 つの環境変数を作成します。これらの環境変数は次の出力で記入されます。

export AWS_ACCESS_KEY_ID=RoleAccessKeyID
export AWS_SECRET_ACCESS_KEY=RoleSecretKey
export AWS_SESSION_TOKEN=RoleSessionToken

2.    次のコマンドを実行して、IAM ロールを引き受けたことを確認します。

aws sts get-caller-identity

AWS CLI コマンドは ARN を arn:aws:iam::123456789012:user/Bob の代わりに arn:aws:sts::123456789012:assumed-role/example-role/AWSCLI-Session として出力する必要があります。これにより、example-role を引き受けたことを確認します。

3.    Amazon RDS DB インスタンスへの読み取り専用アクセス権を持つが EC2 インスタンスへのアクセス権を持たない IAM ロールを作成しました。次のコマンドを実行して確認します。

aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]"
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"

aws ec2 describe-instances コマンドはアクセス拒否エラーメッセージを生成し、aws rds describe-db-instances コマンドは Amazon RDS DB インスタンスを返す必要があります。これにより、IAM ロールに割り当てられている権限が正しく機能していることを確認できます。

4.    IAM ユーザーへ返すには、環境変数を削除します。

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
aws sts get-caller-identity

unset コマンドは環境変数を削除し、aws sts get-caller-identity コマンドは IAM ユーザーの Bob として返されたことを確認します。

~/.aws/config ファイルにプロファイルを作成してロールを使用することもできます。詳細については、「AWS CLI での IAM ロールの使用」を参照してください。