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種類あります。使い分けの基準は「細かく制御するか、書きやすさを取るか」です。

種類特徴
clientAWS APIをそのまま写した低レベルAPI。全操作を扱える
resourceオブジェクト指向的に書ける高レベルAPI。対応サービスは限られる

迷ったら client を使います。ドキュメントやエラーメッセージがAPI名と対応するため、調べやすくなります。

認証情報の解決順序

実務で最初につまずくのが認証です。boto3 はキーをコードに書かなくても、決まった順序で認証情報を探します。

  1. 呼び出し時に明示的に渡した値
  2. 環境変数(AWS_ACCESS_KEY_ID など)
  3. 共有設定ファイル(~/.aws/credentials のプロファイル)
  4. 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です。