こちらのページでは GCP Service Account を AWS から STS で利用する設定例を記載しました。本ページでは、逆に GCP から AWS IAM Role を利用するための設定例を記載します。
Service Account を作成して Unique ID を確認します。
Trust relationship の設定は Web Identity を選択します。Identity Provider として登録されている Google を選択して、Service Account の Unique ID を Audience に指定します。
以下のような Trust relationship となります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "accounts.google.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"accounts.google.com:aud": "102032064262318603671"
}
}
}
]
}
参考資料: Creating a role for web identity or OpenID connect federation (console)
作成した Service Account を紐付けて作成します。
AWS CLI をインストールします。
sudo apt install python3-pip
python3 -m pip install -U pip
python3 -m pip install -U awscli
python3 -m pip install -U boto3
metadata.google.internal
によって VM のメタデータを取得できます。
$ curl -sS -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/name
instance-2
$ curl -sS -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/project/project-id
myproject-20210411
VM に紐付けられた Service Account の identity トークンを取得します。Fetching identity and access tokens using the metadata server
curl -sS -H 'Metadata-Flavor: Google' 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?format=standard&audience=gcp'
Cloud SDK が利用できる場合は、以下のようにしても同様です。
gcloud auth print-identity-token
import boto3
sts = boto3.client('sts', aws_access_key_id='', aws_secret_access_key='')
res = sts.assume_role_with_web_identity(
RoleArn='arn:aws:iam::123412341234:role/my-gcp-role-20211031',
WebIdentityToken='xxxxxxxxxxxxxxxxxxxxxx',
RoleSessionName='my-role-session-name')
以下のようなレスポンスが得られます。
{'Credentials': {'AccessKeyId': 'xxxxxxxxxxxxxxxxxxxx',
'SecretAccessKey': 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
'SessionToken': 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
'Expiration': datetime.datetime(2021, 10, 31, 6, 54, 40, tzinfo=tzlocal())},
'SubjectFromWebIdentityToken': '102032064262318603671',
'AssumedRoleUser': {'AssumedRoleId': 'AROA3JUBRISFUP3BXDZ4A:my-role-session-name',
'Arn': 'arn:aws:sts::123412341234:assumed-role/my-gcp-role-20211031/my-role-session-name'},
'Provider': 'accounts.google.com',
'Audience': '102032064262318603671',
'ResponseMetadata': {'RequestId': '5c16dbd6-ccc8-427c-b123-745bce02b40c',
'HTTPStatusCode': 200,
'HTTPHeaders': {'x-amzn-requestid': '5c16dbd6-ccc8-427c-b123-745bce02b40c',
'content-type': 'text/xml',
'content-length': '1394',
'date': 'Sun, 31 Oct 2021 05:54:39 GMT'},
'RetryAttempts': 0}}
一時的な認証情報として得られた結果を ~/.aws/credentials
に格納してみます。
[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
aws_session_token = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
確かに AWS API を利用できることを確認します。
$ python3 -m awscli s3 ls
2021-08-31 01:10:04 my-bucket-1
2020-06-19 22:58:33 my-bucket-2
上記 STS 認証を自動化するための設定例は以下のとおりです。
$ cat .aws/credentials
[default]
credential_process = /home/myuser/bin/janus.py arn:aws:iam::123412341234:role/my-gcp-role-20211031
credential_process
で指定するコマンドは以下のように準備しておきます。
wget https://raw.githubusercontent.com/doitintl/janus/master/janus.py
python3 -m pip install -U requests
chmod +x ./bin/janus.py
動作確認
$ python3 -m awscli s3 ls
2021-08-31 01:10:04 my-bucket-1
2020-06-19 22:58:33 my-bucket-2
参考資料: