破棄されたブログ

このブログは破棄されました。

IAM ユーザで STS を殴って一時的なアクセス権を取得する

AWS で一時的なクレデンシャルを取得したいというシナリオは珍しくなさそうです。 一時的なクレデンシャルを取得するには、 STS に assume role します。 また、 Principal で IAM ユーザを指定することで、Role のない EC2 インスタンスからも取得できます。

手順

IAM Role の作成

まずは、 assume policy document を作成する。ここでは、 policy-document.json としました。 Principal でユーザを指定しているところが善光寺味噌です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account-id>:user/<user-name>"
            }
        }
    ]
}

作成した assume policy document を使って、 IAM Role を作ります。

aws iam create-role --role-name=<role-name> --assume-role-policy-document=file://./policy-document.json

次に、一時的な与える権限を設定します。ここでは、 AmazonS3ReadOnlyAccess を設定してみます。

aws iam attach-role-policy --role-name=<role-name> --policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

では、最後に一時的なクレデンシャルを取得してみます。以下は boto を使った例です。

from boto.sts import connect_to_region


conn = connect_to_region('ap-northeast-1', aws_access_key_id='<aws_access_key_id>', aws_secret_access_key='<aws_secret_access_key>')
role = conn.assume_role('arn:aws:iam::<account-d>:role/<role-name>', 'spamspam')

はい。これで一時的なクレデンシャルが取れました。 上記の role 変数は、 boto.sts.credentials.AssumedRole オブジェクトなので、 role.credentials の中にクレデンシャルが入っています。

以上、 EC2 インスタンスにはキチンと Role をつけましょうねというお話でした。

参考資料

広告を非表示にする