boto3(AWS SDK for Python)
boto3とは
boto3 は、[[Python]] から [[AWS]] のサービスを操作する公式SDKです。マネジメントコンソールやCLIでできる操作を、そのままコードから呼べます。
import boto3
s3 = boto3.client("s3")
s3.upload_file("report.csv", "my-bucket", "reports/report.csv")
APIは大きく2種類あります。使い分けの基準は「細かく制御するか、書きやすさを取るか」です。
| 種類 | 特徴 |
|---|---|
| client | AWS APIをそのまま写した低レベルAPI。全操作を扱える |
| resource | オブジェクト指向的に書ける高レベルAPI。対応サービスは限られる |
迷ったら client を使います。ドキュメントやエラーメッセージがAPI名と対応するため、調べやすくなります。
認証情報の解決順序
実務で最初につまずくのが認証です。boto3 はキーをコードに書かなくても、決まった順序で認証情報を探します。
- 呼び出し時に明示的に渡した値
- 環境変数(
AWS_ACCESS_KEY_IDなど) - 共有設定ファイル(
~/.aws/credentialsのプロファイル) - EC2 や Lambda に付与された IAMロール
本番では 4 を使い、キーを配置しないのが原則です。[[AWS IAM]] のロールに必要な権限だけを与えれば、[[シークレット管理]] の対象そのものを減らせます。「ローカルではプロファイル、本番ではロール」と分けると、コードは同じまま環境だけが変わります。
ページネーションとリトライ
一覧取得系のAPIは1回で全件返りません。返却上限を超えた分は次ページとして返るため、素朴に呼ぶと件数が静かに欠けます。
paginator = s3.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket="my-bucket"):
for obj in page.get("Contents", []):
print(obj["Key"])
get_paginator を使うと、この繰り返しをSDK側が面倒を見ます。一覧系は必ずページネーターを通すと覚えておくと事故が減ります。
スロットリング(呼び出し過多による拒否)などの一時的な失敗に対しては、SDK が既定で再試行します。それでも足りない場合は [[エラーハンドリングとリトライ設計]] の考え方で、呼び出し側に待ち時間を入れた再試行を足します。
初学者向けポイント
- まずは読み取り専用の権限で試すと、誤操作の影響を抑えられます
- リージョンは明示的に指定するか設定で固定します。未指定のまま環境が変わると、意図しないリージョンのリソースを見に行って「存在しない」と誤解します
- 例外は
botocore.exceptions.ClientErrorに集約され、エラーコードで種類を判別します - [[Amazon S3]] のようにサービスごとにAPIの癖があるため、公式リファレンスを引きながら書く前提で進めます
関連技術とのつながり
- [[Python]] — 実装言語。スクリプトからの運用自動化と相性が良い
- [[AWS]] — 操作対象のクラウド。コンソールでの操作をコードへ写せる
- [[AWS IAM]] — 認証情報の実体。本番はロールで渡すのが原則
- [[Amazon S3]] — boto3 で最もよく触るサービスのひとつ
- [[エラーハンドリングとリトライ設計]] — スロットリングや一時障害への備え
Q: 本番環境のboto3で推奨される認証情報の渡し方はどれ?
- [ ] コードにアクセスキーを直接書く
- [x] EC2やLambdaに付与したIAMロールを使う
- [ ] リポジトリに認証ファイルをコミットする
解説: IAMロールを使えばキーを配置せずに済み、シークレット管理の対象そのものを減らせます。
Q: 一覧取得系APIで件数が欠けるのを防ぐ方法はどれ?
- [ ] 取得件数の上限を無視して1回だけ呼ぶ
- [x] ページネーターを使って全ページを取得する
- [ ] 取得結果をソートする
解説: 一覧系APIは1回で全件返らないため、`get_paginator` で全ページをたどる必要があります。
Q: boto3のclientとresourceの違いとして正しいものはどれ?
- [x] clientは低レベルで全操作を扱え、resourceは高レベルだが対応サービスが限られる
- [ ] clientは読み取り専用、resourceは書き込み専用
- [ ] 両者に機能差はなく名前が違うだけ
解説: client は AWS API をそのまま写した低レベルAPI、resource はオブジェクト指向的に書ける高レベルAPIです。