探訪:AWS SDK (Boto3)

こんにちは、ひるたんぬです。

最近は耐え難い暑さが続いておりますね…
私はとても暑さに弱い生物なので、ひと月ほど前からエアコンの恩恵にあずかっているのですが、エアコンの設定温度ってとても難しいなと思っています。
というのも期待した温度にならないのです。28℃に設定してるのに25℃近くになったり、逆に30℃くらいになったり…
エアコンも暑さでおかしくなってしまったのでしょうか…?今夏を乗り越えてくれるよう切に願っています。

さて、今回は業務でSDK(boto3)に触れている中で、ふと気になった点について調査をしました。

気になったこと

Secrets Managerからシークレットを取得したい!と思った際、マネジメントコンソールでは各言語でのサンプルコードを示してくれています。(とても親切!!)例えば、Python3(boto3)の場合は以下のようになっています。

# Use this code snippet in your app.
# If you need more information about configurations
# or implementing the sample code, visit the AWS docs:
# https://aws.amazon.com/developer/language/python/

import boto3
from botocore.exceptions import ClientError


def get_secret():

  secret_name = "SECRET_NAME"
  region_name = "REGION_NAME"

  # Create a Secrets Manager client
  session = boto3.session.Session()
  client = session.client(
    service_name='secretsmanager',
    region_name=region_name
  )

  try:
    get_secret_value_response = client.get_secret_value(
      SecretId=secret_name
    )
  except ClientError as e:
    # For a list of exceptions thrown, see
    # https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
    raise e

  secret = get_secret_value_response['SecretString']

# Your code goes here.

このコードを見て、私は「boto3.session.Session()ってなんぞや?」と思いました。
そう、この記述とはここで会ったのが初めてだったのです。

boto3のSessionとは

こういうときに役に立つのは、やはり公式ドキュメントですね。
Boto3の公式ドキュメントには次のように記載があります。

A session stores configuration state and allows you to create service clients and resources.

引用:AWS 「Boto3 1.34.146 documentation -Session reference-

つまり、アクセスキーやシークレットキーなどの認証情報を一つのオブジェクトとしてまとめて生成し、それをクライアントやリソースオブジェクトの生成時に引数として指定することで使い回すことができる、という仕組みのようです。複数のクライアントやリソースオブジェクトを生成する際に、いちいち認証情報を入力しなくて済むので、これは便利な機能ですね。

さらなる疑問

Sessionについて調べる中で、公式ドキュメント内でSessionを以下のように使っている場合もありました。

# Explicitly create a new Session for this thread 
session = boto3.Session()
dynamodb = session.resource('dynamodb')

 

そうです、”session”が一つ欠けているのです。こういうのすごく気になってしまうんですよね…
こちらについては、結論から言いますと同じオブジェクトを指しておりました。

せっかくなので、boto3のソースコードを見て確認してみましょう。
今回は執筆時点での最新バージョンである「1.34.146」のコードで確認しています。

boto3.session.Session()と記載する場合

この場合は、boto3フォルダにある”session.py”を参照し、Sessionクラスを呼び出しています。

boto3.Session()と記載する場合

この場合は、boto3フォルダにある”__init__.py”を参照します。
するとこのファイルの17行目に

from boto3.session import Session

と記載があります。これによって、boto3フォルダにある”session.py”を参照し、Sessionクラスを呼び出していることが分かりましたね。

おわりに

細かいところが気になってしまう性分なのでしっかり調べました。
こういうことを一つずつ知るたびに成長しているなぁ…と実感できて嬉しいです。

余談ですが、botoの名前の由来は「アマゾン川に自生する淡水イルカ(アマゾンカワイルカ)」だそうです。

また、Boto3の数字はライブラリのメジャーバージョン(3番目)を示しているようです。
下記サイトに載っていたのですが、なぜDynamoDB上のドキュメントにBotoの由来などが記載されているのでしょうか…謎は深まるばかりですね。

タイトルとURLをコピーしました