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

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

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

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

解決済

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

YumiSakura
sakura

総合スコア98

Python

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

1回答

0グッド

0クリップ

208閲覧

投稿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ですよと宣言しているのかと思っておりました)

お願いしたいこと

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

YumiSakura

2022/10/25 07:33

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

回答1

2

ベストアンサー

これはコード内にある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

総合スコア10482

sakura, meg_😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

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