aws-sdk-python-usage
AWS SDK for Python(boto3/botocore)を使った開発パターンに関するスキルです。Pythonコードでboto3またはbotocore経由でAWSサービスを利用する際に必ず使用し、サービスクライアント・リソースの作成、セッションや認証情報の設定、`ClientError`によるエラーハンドリング、ページネーターやウェイターの活用、S3ファイル転送・署名付きURL、DynamoDBテーブル操作など幅広いシナリオをカバーします。Pythonコードにboto3やboocoreのインポートが含まれる場合、またはユーザーがPythonでのAWS操作について質問した場合に適用されます。
description の原文を見る
| AWS SDK for Python (boto3/botocore) development patterns. You MUST use this skill when writing Python code that uses AWS services via boto3 or botocore. This includes creating service clients or resources, configuring sessions and credentials, handling errors with ClientError, using paginators and waiters, S3 file transfers and presigned URLs, DynamoDB table operations, and any boto3/botocore client configuration. Use this skill whenever Python code imports boto3 or botocore, or when the user asks about AWS operations in Python.
SKILL.md 本文
このスキルがアクティブな場合、コード、コメント、出力内で絵文字を使用しないでください。
AWS SDK for Python (boto3)
boto3 は AWS 向けの高レベル Python SDK です。低レベル SDK である botocore をラップし、2 つの異なるインターフェイスを提供します:クライアント(低レベル、1:1 API マッピング)とリソース(高レベル、オブジェクト指向)。どちらをいつ使うべきかを理解することが必須です。
クライアント vs リソース
クライアントは AWS サービス API に直接マップします。すべてのサービスにはクライアントがあります。レスポンスはプレーン dict です。
リソースはアトリビュートとアクションを備えたオブジェクト指向インターフェイスを提供します。リソースを持つのはいくつかのサービスのみです(S3、DynamoDB、EC2、IAM、SQS、SNS、CloudFormation、CloudWatch、Glacier)。リソースは型を自動的にマーシャル化します(特に DynamoDB に有用)。
import boto3
# クライアント - 低レベル、すべてのサービス
s3_client = boto3.client("s3")
response = s3_client.list_buckets()
buckets = response["Buckets"] # プレーン dict
# リソース - 高レベル、選定サービス
s3_resource = boto3.resource("s3")
for bucket in s3_resource.buckets.all():
print(bucket.name) # dict キーではなくアトリビュートアクセス
API の完全なカバレッジが必要な場合、またはサービスにリソースインターフェイスがない場合はクライアントを使用してください。リソースが存在し、コードを単純化できる場合(特に DynamoDB と S3)はリソースを使用してください。
セッションとクライアント作成
import boto3
# デフォルトセッションが暗黙的に作成される
client = boto3.client("s3")
resource = boto3.resource("dynamodb")
# クライアント作成方法をカスタマイズする必要があるとき、
# または特定のプロファイルを使用するときは明示的セッションを使用
session = boto3.Session(
profile_name="my-profile",
region_name="us-west-2",
)
client = session.client("s3")
ループ内でクライアントを作成しないでください。単一のクライアント インスタンスを再利用してください。クライアントはスレッドセーフであり、インスタンス化後はスレッド全体で共有できます。
API 呼び出し
# クライアント - パラメータをキーワード引数として渡し、dict を返す
response = client.get_object(Bucket="my-bucket", Key="my-key")
data = response["Body"].read()
# リソース - オブジェクトメソッドとアトリビュートを使用
obj = s3_resource.Object("my-bucket", "my-key")
response = obj.get()
data = response["Body"].read()
パラメータ名は AWS API の大文字小文字を正確に一致させます。通常は snake_case ではなく PascalCase です。
エラーハンドリング
例外は、実行可能なアクション(フォールバック値の返却、再試行、別のコードパスの選択)がある場合にのみキャッチしてください。例外をキャッチしてそれを出力するだけで無視することは間違っています。実際のエラーを隠し、呼び出し元が反応することを防ぎます。デフォルトでは例外を伝播させてください。
キャッチする場合は、文字列コードマッチングによる一般的な ClientError ではなく、client.exceptions アトリビュートを通じたクライアント上の型付き例外を優先してください:
lambda_client = boto3.client("lambda")
def get_function_config(name: str) -> dict | None:
"""関数設定を返すか、存在しない場合は None を返す。"""
try:
return lambda_client.get_function_configuration(FunctionName=name)
except lambda_client.exceptions.ResourceNotFoundException:
return None # 実行可能:不足している関数を None に変換
# その他すべてが伝播 - 呼び出し元または main() が処理
一般的な ClientError はビジネスロジック関数ではなく、トップレベルのエラーハンドラでのみキャッチオールとして使用してください。これは boto3 ではなく botocore に存在します:
from botocore.exceptions import ClientError
def main() -> int:
try:
result = do_the_work()
print(result)
return 0
except ClientError as e:
print(f"Error: {e}", file=sys.stderr)
return 1
完全なエラー階層と botocore 例外については、references/error-handling.md を参照してください。
スクリプト構造
boto3 または botocore を使用するスクリプトを書くよう指示されたときは、if __name__ == "__main__" を単一の関数呼び出しに保ってください。引数の解析、エラー表示、および終了コードは、ビジネスロジック関数に分散させるのではなく main() に属します:
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("bucket")
args = parser.parse_args()
try:
do_the_work(args.bucket)
return 0
except ClientError as e:
print(f"Error: {e}", file=sys.stderr)
return 1
if __name__ == "__main__":
sys.exit(main())
ビジネスロジック関数から sys.exit() を呼び出さないでください。関数をテスト不可能で、ライブラリとして使用不可能にします。代わりに例外を発生させるか、エラー値を返し、main() にそれをどう提示するかを決定させてください。
ページネーション
NextToken で手動ループを行わないでください。ページネータを使用してください。特定のフィールドのみが必要な場合は、.search() を JMESPath 式と共に使用して、ページ全体で抽出およびフラット化してください:
paginator = iam.get_paginator("list_users")
for name in paginator.paginate().search("Users[].UserName"):
print(name)
# フィルタリングと投影
for arn in paginator.paginate().search("Users[?Path == '/admin/'][].Arn"):
print(arn)
アイテムごとに完全なレスポンスオブジェクトが必要な場合、またはページごとの制御が必要な場合(例えば、ページのカウント、ページごとのバッチ処理)は、ページを直接反復してください:
for page in paginator.paginate():
for user in page.get("Users", []):
process(user)
ページネーションの詳細については、references/pagination.md を参照してください。
ウェイター
リソースが目的の状態に到達するまで待機してください:
waiter = client.get_waiter("bucket_exists")
waiter.wait(
Bucket="my-bucket",
WaiterConfig={"Delay": 5, "MaxAttempts": 20},
)
ウェイターの詳細については、references/waiters.md を参照してください。
クライアント構成
再試行、タイムアウト、接続プール設定など、botocore.config.Config を使用してください:
from botocore.config import Config
config = Config(
retries={"total_max_attempts": 2, "mode": "adaptive"},
connect_timeout=5,
read_timeout=10,
max_pool_connections=50,
)
client = boto3.client("s3", config=config)
クライアント向けカスタム構成を作成するときは、references/configuration.md を参照してください。
ロギング
boto3 と botocore の両方は標準ライブラリ logging モジュールを使用します。標準 logging API を通じてロギングを設定することも、便宜上 boto3 と botocore が提供するヘルパーを使用することもできます:
# クイック:すべての botocore ワイヤレベルの詳細を stderr にログ
boto3.set_stream_logger("") # ルートロガー -- すべて
boto3.set_stream_logger("botocore") # botocore のみ
# Botocore、すべての botocore 詳細をログ
import logging
from botocore.session import Session
session = Session()
session.set_stream_logger('botocore', logging.DEBUG)
# または:ファイルにロギングを設定
session.set_file_logger(logging.DEBUG, '/tmp/botocore.log')
set_stream_logger(name, level=logging.DEBUG) は指定されたロガーに StreamHandler を追加します。これは SDK からのリクエスト/レスポンスデバッグ出力を取得するための慣用的な方法です。
一般的な問題
問題:ClientError インポート位置
誤り: from boto3.exceptions import ClientError
正し: from botocore.exceptions import ClientError
サービス固有のカスタマイズ
以下のサービスを使用する Python コードを作成する場合、ベストプラクティスとカスタム高レベル API のために以下の追加リファレンスファイルを読み込む必須です:
- S3 -
references/s3.mdを読み込む必須です。 - Dynamodb -
references/dynamodb.mdを読み込む必須です。
リファレンス
- クライアント構成(再試行、タイムアウト、エンドポイント):
references/configuration.md - 認証情報とセッション:
references/credentials.md - エラーハンドリングパターン:
references/error-handling.md - ページネーション:
references/pagination.md - ウェイター:
references/waiters.md - S3 転送と署名付き URL:
references/s3.md - DynamoDB 操作:
references/dynamodb.md
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- aws
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/aws/agent-toolkit-for-aws / ライセンス: Apache-2.0
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。