boto3でs3.resourceが非推奨に・・・

プログラミング
この記事は約4分で読めます。

みなさん、こんにちは!
AWSのboto3となかなかお友達になれない、、、と思いながら色々調べたりしながら
せっせとLambdaを使ってみたりしています。

よく私の使い方として、LambdaでWebスクレイピングし、取得したものをs3にアップロードするということをやっています。
そんな中、クラスメソッドさんで2023/1/19に書かれていた記事でガクブルしました。

AWS Python SDK(boto3)のリソース・インターフェースが改修凍結されました | DevelopersIO
boto3のresourceインターフェースが使えなくなるわけではないのでご安心を

自分もAWS使い始めたばかりの時にいろんなところでググりながら、boto3を使ってどうやってs3から取得するか、、、など色々考えていて、かなーり使っておりました。

だってみんな使っちゃってるんですもん笑

s3.resourceが使えなくなったとしても、s3.clientがあるから大丈夫! なんですが、、、
s3.resourceとs3.clientではお作法が少し、微妙〜に違うので、解説します!

s3.resourceとs3.clientの違い

同じものなのに、なんで2つもあるのか、、、?
AWSって意外と同じようなものなんだけど使い方が若干違う。みたいなものが多いですよね笑

簡単にいうと、
Client: 低レイヤーのサービスのアクセスが可能
・ Resource: 高レイヤーのオブジェクト指向なサービスアクセスが可能

という違いがあります。
低レイヤーと高レイヤーの違いだけなのですが、
低レイヤーということは、比較的多めにコードを書く必要が出てきます。

どんな違いが生まれるのか?

とはいえ、なんとなくやってみた感じですが、そんなに多くのコードを書く必要もないかも。
ということで、あくまでも自分の書き方なところが多いのでご注意ください。。。

boto3.resource

まずはboto3.resourceの場合で、Lambdaで、bucketのところにハードコートでですがs3バケット名を書いておきます。
そこに置かれたhoge.jsonをLambdaのtmpに書き出す。という流れだとこんな感じかなと思います。

import boto3
import os

def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    key = "hoge.json"
    f_path = f"/tmp/{os.path.basename(key)}.json'"
    s3.Bucket(BUCKET_Name).download_file(key, f_path)

s3.client

それが、s3.clientだと、こうなります。

import boto3
import os

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    BUCKET = "BUCKET_Name"
    key = "hoge.json"
    f_path = f"/tmp/{os.path.basename(key)}.json'"
    s3.download_file(BUCKET,key, f_path)

変化点

ダウンロードくらいなら、お作法が少しだけ変わったくらいで、そんなに大差はない感じかなという印象です。
最後のdownload_fileのところで、バケット名、キー、outputパス名のところの並びくらいですかね。

とはいえ、今までこのやり方に慣れていた方は書き方とかも気をつけないと。。。という感じですので、自分も学び直しながら進めていきたいなと思います。。。

自分の本来の使い方的には、s3に置かれたことをトリガーにして発行されるEventBridgeを使っているので、その使い方だとそんなに変わるか、、、?て思ったりも。

非推奨となるので、対応は必要だとは思いますが、いったんは様子見で、、、というのもありなのかもしれませんね。

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