動機
boto3のclientやresourceって、以下のように生成しますよね。
ecs = boto3.client('ecs')
dynamodb = boto3.resource('dynamodb')
これに対して、「1つの接続を使い回すべき」と言われ、以下の書き方を勧められたことがありました。
session = boto3.Session()
ecs = session.client('ecs')
dynamodb = session.resource('dynamodb')
これについて、ちょっとだけ調べてみたので、記事を書いてみます。(詳細をご存知の方がおりましたら是非教えて下さい!)
結論
元の書き方で問題無さそう。
ecs = boto3.client('ecs')
dynamodb = boto3.resource('dynamodb')
理由
まず、boto3.Sessionが何者なのかをコードのコメントで調べてみました。
A session stores configuration state and allows you to create service clients and resources.
(設定の状態を格納し、サービスクライアント及びリソースを作成できるようにするためのセッション。)
おそらくAWS SDKの認証情報のページにあるような、環境変数とかプロファイルとかから取得した認証情報を格納するだけのクラスに見えます。つまり、この時点では通信や接続は行っていないと考えられます。
そして、clientやresourceを生成する箇所のコードを見てみると、
def resource(*args, **kwargs):
return _get_default_session().resource(*args, **kwargs)
def _get_default_session():
if DEFAULT_SESSION is None:
setup_default_session()
return DEFAULT_SESSION
def setup_default_session(**kwargs):
global DEFAULT_SESSION
DEFAULT_SESSION = Session(**kwargs)
となっていました。clientやresourceを生成する時、初回はDEFAULT_SESSIONにSessionをセットしてから生成し、2回目以降はそのSessionを使い回して生成しています。勧められた方法をboto3が内部でやっていてくれたんですね。
また、このコードより、プロファイルなどを指定したclientやresourceの生成方法も分かりますね。
boto3.setup_default_session(profile_name='ttkiida')
dynamodb = boto3.resource('dynamodb')
今まで以下のように書いていましたが、わざわざSessionを持ち出す必要は無かったということです。
session = boto3.Session(profile_name='ttkiida')
dynamodb = session.resource('dynamodb')
これで実装が大きく変わることはありませんが、色々整理されて少しスッキリしましたw