AWS: EC2 から S3 に STS AssumeRole で接続する

 
S3 接続で STS AssumeRole を使う必要があったのでメモ

まずは EC2 にアタッチする IAM Role の Trust Relationships (信頼関係) タブの中のエントリーを修正する。

下記のPrincipal.AWS の値のところには ARN をセットする。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<ACCOUNT-HERE>:role/<ROLE-HERE>"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

 
次は EC2.

EC2 に ssh ログインして awscli で AssumeRole してから環境変数に値をセットする。
–role-arn には上記と同じく EC2 にアタッチする Role の ARN を渡す。

jq コマンド使って JSON パースすれば楽。

#!/bin/bash
OUTPUT=$(aws sts assume-role --role-arn "arn:aws:iam::<ACCOUNT-HERE>:role/<ROLE-HERE>" --role-session-name AWSCLI-Session)
export AWS_ACCESS_KEY_ID=$(echo $OUTPUT | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo $OUTPUT | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo $OUTPUT | jq -r '.Credentials.SessionToken')

S3 にアクセス出来るか確認

aws s3api list-objects --bucket your-bucket-name --region ap-northeast-1