speg03の雑記帳

主に未来の自分のために試したことなどを記録しています

boto3を使った一時的なAWS認証情報の取得

概要

IAMロールの切り替えを利用している場合の一時的なAWS認証情報の取得方法について説明します。boto3を使うと、AWS CLIのプロファイル設定をもとに認証情報を簡単に取得することができます。

IAMロールの切り替え

AWS CLIでIAMロールの切り替えを行う場合は、以下のようなプロファイル設定をします。

[profile prodaccess]
role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
source_profile = default

設定内容の詳細については以下のページが参考になります。

IAM ロールの切り替え(AWS Command Line Interface) - AWS Identity and Access Management https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-cli.html

また、IAMロールの切り替え自体については以下のページが参考になります。

チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任 - AWS Identity and Access Management https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html

boto3を使った一時的なAWS認証情報の取得

使用したバージョンは以下の通りです。 * Python 3.6.4 * boto3 1.5.21

boto3は明示的にIAMロールの切り替えを行わなくても、プロファイル設定を見て必要があれば自動的にIAMロールの切り替えを行ってくれます。そのため、以下のような簡単なPythonコードで一時的なAWS認証情報を取得できます。

import boto3

session = boto3.session.Session(profile_name='prodaccess')
credentials = session.get_credentials()

print('export AWS_ACCESS_KEY_ID={}'.format(credentials.access_key))
print('export AWS_SECRET_ACCESS_KEY={}'.format(credentials.secret_key))
print('export AWS_SESSION_TOKEN={}'.format(credentials.token))

このコードを実行すると以下のような出力が得られます。この出力をシェルで評価すると一時的なAWS認証情報として利用することができます。

$ python3 credentials.py
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_SESSION_TOKEN=AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLECvSRyh0FW7jEXAMPLEW+vE/7s1HRpXviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDyEXAMPLEKEY9/g7QRUhZp4bqbEXAMPLENwGPyOj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3UusKdEXAMPLE1TVastU1A0SKFEXAMPLEiywCC/Cs8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLENhykxiHenDHq6ikBQ==

ただし、この方法では認証情報の有効時間を指定できないため、デフォルトの1時間が適用されます。

認証情報の有効時間(DurationSeconds)については以下に記載があります。

AssumeRole - AWS Security Token Service https://docs.aws.amazon.com/ja_jp/STS/latest/APIReference/API_AssumeRole.html