#はじめに
AWSの各種リソースをPythonでコントロールする際に使うboto3ですが、クレデンシャルを切り替える方法はいくつかの種類があり、優先順序が混乱しがちな為復習を兼ねて調べてみました。これでAWS環境の切り替えも楽々です。
#boto3のクレデンシャル検索順序
boto3は以下の順序でクレデンシャルを検索し使用します。
- boto.client()メソッドのパラメータとして渡されたクレデンシャル
- セッションオブジェクトを作成する際のパラメータとして渡されたクレデンシャル
- 環境変数
- 共有クレデンシャルファイル (~/.aws/credentials)
- AWS config ファイル(~/.aws/config)
- Assume Role provider
- Boto2 config ファイル (/etc/boto.cfg , ~/.boto)
- IAMロールが設定されているAmazon EC2インスタンス上のインスタンスメタデータサービス
以下、YOUR_ACCESS_KEY、YOUR_SECRET_KEYは適宜自身の環境の値で読み替えてください。
1. boto.client()メソッドのパラメータとして渡されたクレデンシャル
import boto3
client = boto3.client(
's3',
aws_access_key_id=YOUR_ACCESS_KEY,
aws_secret_access_key=YOUR_SECRET_KEY,
)
boto3.clientを呼び出すときに明示的に使用したい環境のクレデンシャル情報を渡す方法です。
実際の値は環境変数経由で取得するなどとし、コード内に生の値を書き込むことは回避する方が良いです。
2. Sessionオブジェクトを作成する際のパラメータとして渡されたクレデンシャル
import boto3
session = boto3.Session(
aws_access_key_id=YOUR_ACCESS_KEY,
aws_secret_access_key=YOUR_SECRET_KEY,
)
1と同様、boto3.Sessionを作成する際に明示的に使用したい環境のクレデンシャル情報を渡す方法です。
3. 環境変数
export AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
Pythonを実行する環境の環境変数にクレデンシャル情報をセットしておくと、boto3が参照してくれます。
クレデンシャルの切り替えが発生しない場合には簡単な方法であり、使用することも多いです。
4. 共有クレデンシャルファイル (~/.aws/credentials)
[your_profile_name]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
import boto3
session = boto3.Session(profile_name='your_profile_name')
client = session.client('s3')
~/.aws/credencials
にプロファイルごとのaws_access_key_id
、aws_secret_access_key
を設定した後、boto3では設定したプロファイル名を指定します。
awscliでおなじみの方法で設定したプロファイル情報を利用できるので視認性に優れており、ローカル開発環境でもよく利用します。
5. AWS config ファイル(~/.aws/config)
[profile YOUR_PROFILE_NAME]
region = YOUR_REGION
output = TOUR_OUTPUT
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_KEY
aws configure
コマンドでクレデンシャルを設定した場合、access_key_id
及びsecret_access_key
はcredentialsファイルに記載されます。この内容はconfigファイルに記載することも可能な為、regionやoutput情報に加えて、上記のようにクレデンシャル情報を記載することができます。
6. Assume Role provider
[profile YOUR_TARGET_PROFILE_NAME]
role_arn = YOUR_TARGRT_ROLE_ARN
source_profile = YOUR_PROFILE_NAME
対象となるAWSアカウントのアクセスキー、シークレットキーを直接利用せず、IAMロールを通じて操作をする場合は対象のAWS環境へAssumeRoleをリクエストし、返されたクレデンシャルを用いることで操作することができます。
~/.aws/config
へ利用するロールのARNと元となるプロファイル名を設定することで利用可能です。
7. Boto2 設定ファイル (/etc/boto.cfg, ~/.boto)
boto2との下位互換性がある為、Boto_CONFIG
が設定されていればBOTO_CONFIG
が指定するファイルをチェックし、そうでなければ /etc/boto.cfg
と~/.boto
をチェックします。
8. IAMロールが設定されているAmazon EC2インスタンス上のインスタンスメタデータサービス
Amazon EC2にはIAMロールを割り当てることができる為、EC2上で動作しており、上記のいずれも設定されていない場合はインスタンスのメタデータサービスから資格情報を読み込みます。
この機能を利用するには、EC2インスタンスの作成時に使用するIAMロールを指定しておく必要があります。
参考文献
この記事は以下の情報を参考にして執筆しました。