質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

456閲覧

boto3のコードの見方、書き方がよくわかりません

YumiSakura

総合スコア101

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/10/25 07:16

実現したいこと

boto3のコードの見方について理解したい

前提

指定されたS3バケットにファイルがPUTされたのをトリガーに実行するLambda関数を作成しています。その書き方でよくわからないところがあります。

対象のコード

こちらのコードで不明点があります。

import json import urllib.parse import boto3 print('Loading function') s3 = boto3.client('s3') def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) # Get the object from the event and show its content type bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: response = s3.get_object(Bucket=bucket, Key=key) print("CONTENT TYPE: " + response['ContentType']) return response['ContentType'] except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e

不明点

  1. s3 = boto3.client('s3')とありますが、これはコード内にあるs3がboto3を使用するリソースだ、ということでしょうか?

  2. bucket = event['Records'][0]['s3']['bucket']['name']にある['Records'][0]['s3']['bucket']['name']はどういう意味でこの書き方になっているのでしょうか?

  3. s3 = boto3.client('s3')s3 = boto3.resource('s3')の違いはなんでしょうか?(両者ともboto3を使用するリソースはs3ですよと宣言しているのかと思っておりました)

お願いしたいこと

書き方の例やドキュメントも見ましたがよくわからない点を質問させていただきました。
ご存知の方、ご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YumiSakura

2022/10/25 07:33

ご丁寧にリンクをありがとうございます。 理解ができているか不安なのですが、 たとえばs3 = boto3.client('s3')は、これからboto3で定義されているs3のコードを使用します! のような宣言みたいなものなのでしょうか?
guest

回答1

0

ベストアンサー

これはコード内にあるs3がboto3を使用するリソースだ

この文章の意味がよくわかりませんが、軽く説明してみます。
まず、「boto3」で検索すれば説明が出てくるように、boto3はpythonからAWSのサービスを使うための便利モジュールです。 そして、AWSのいろいろなサービスをうまく扱うための仕組みとして、サービスごとにインスタンス(オブジェクト)を作って、それを通してサービスとやりとりする方式を取っています。
s3 = boto3.client('s3')というコードは、S3のサービスを使うためのオブジェクトを作ってそれをs3という変数で利用できるようにするコードです。

['Records'][0]['s3']['bucket']['name']ははどういう意味

単に、pythoのネストした辞書やリストへのアクセスです。

s3 = boto3.client('s3')と s3 = boto3.resource('s3')の違い

両方ともS3のサービスを使うためのオブジェクトを生成しますが、clientの方がAWSのAPIに近い(=低レイヤー)コマンドを実装していて、resourceの方がより抽象化した(=高レイヤー)のコマンドを実装しています。
基本的には同じことができますので、resourceを使った方が作りやすくいし、わかりやすいコードになると思います。

投稿2022/10/25 10:26

編集2022/10/25 10:49
TakaiY

総合スコア12666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YumiSakura

2022/10/27 01:08

とてもわかりやすい解説ありがとうございます。 初歩的な質問で恐縮なのですが、『event['Records'][0]['s3']['bucket']['name']』は今回であれば ['Records']キーの中の[0]キーの中の⋯のような流れで最終的に['name']キーの値を変数eventに格納し、 それをbucketに代入している、 ということでしょうか?
TakaiY

2022/10/27 05:26 編集

他は合ってますが、「[0]」というのは、リストの0番目を取得することを意味します。 Recordsキーに対応する値がリストになっているってことですね。 「変数eventに格納し、それをbucketに代入している」 のようなことはしていません。 「['name']キーの値がbucketに代入」されます。
YumiSakura

2022/10/28 00:19

『event』はdef lambda_handlerの引数かと思いますが、この『event』にはトリガー情報、今回であれば S3バケットにファイルがPUTされたトリガーの情報が入っていて このトリガー対象のS3バケット名がnameに入る、 といった認識でしょうか?
TakaiY

2022/10/28 00:47

提示されたソースだけでは lambda_handler 関数が何を引数にして呼ばれるのかわかりませんので、回答できません。 だだ、もし、 lambda_handler関数が、ファイルがPUTされたときに呼ばれるのだとしたら、イベントにそのファイルの情報は入っていそうですね。 eventにどのような情報が入っているかは「print("Received event: " + json.dumps(event, indent=2))」としているところの出力を見ればわかるでしょう。
YumiSakura

2022/10/31 01:30

とてもわかりやすいです! ありがとうございます!!! 早速教えていただきたコマンドを実行して確認します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問