boto3でs3.resourceが改修凍結に・・・
*もともとWordPressで2023/1/19に公開していたものをこちらに移設しました。
みなさん、こんにちは!
AWSのboto3となかなかお友達になれない、、、と思いながら色々調べたりしながらせっせとLambdaを使ってみたりしています。
よく私の使い方として、LambdaでWebスクレイピングし、取得したものをs3にアップロードするということをやっています。
そんな中、クラスメソッドさんで2023/1/19に書かれていた記事でガクブルしました。
自分もAWS使い始めたばかりの時にいろんなところでググりながら、
boto3を使ってどうやってs3から取得するか、、、など色々考えていて、
かなーり使っておりました。
だってみんな使っちゃってるんですもん笑
s3.resourceが使えなくなったとしても、s3.clientがあるから大丈夫!
なんですが、、、
s3.resourceとs3.clientではお作法が少し、微妙〜に違うので、解説します!
s3.resourceとs3.clientの違い
同じものなのに、なんで2つもあるのか、、、?
AWSって意外と同じようなものなんだけど使い方が若干違う。
みたいなものが多いですよね笑
簡単にいうと、
・Client: 低レイヤーのサービスのアクセスが可能
・ Resource: 高レイヤーのオブジェクト指向なサービスアクセスが可能
という違いがあります。
低レイヤーと高レイヤーの違いだけなのですが、
低レイヤーということは、比較的多めにコードを書く必要が出てきます。
どんな違いが生まれるのか?
とはいえ、なんとなくやってみた感じですが、そんなに多くのコードを書く必要もないかも。
ということで、あくまでも自分の書き方なところが多いのでご注意ください。。。
boto3.resource
まずはboto3.resourceの場合です。
bucketのところにハードコートでですがs3バケット名を書いておきます。
そこに置かれたhoge.jsonをLambdaのtmpに書き出す。という流れだとこんな感じかなと思います。
import boto3
import os
def lambda_handler(event, context):
s3 = boto3.resource('s3')
BUCKET = "BUCKET_Name"
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を使っているので、その使い方だとそんなに変わるか、、、?て思ったりも。
非推奨となるので、対応は必要だとは思いますが、いったんは様子見で、、、というのもありなのかもしれませんね。