LoginSignup
9

More than 3 years have passed since last update.

boto3のSessionについて

Posted at

動機

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9