【Python】boto3を使って、AWS Lambdaで画像をS3に格納してみた!

AWS

今回は AWS Lambda を使って、画像を S3 バケット に自動で格納する方法について解説します!

Lambdaは、起動のトリガーを設定することが可能ですが、今回の記事ではlambda自体は手動実行し、あくまで画像をS3へ格納する部分のみにフォーカスしています!

LambdaとS3の基礎知識があるとスムーズに進められますが、初心者の方でも理解しやすいように解説します。

概要を簡単に説明すると、

●Lambdaはサーバーレスの関数でEC2などのサーバーを用意せずとも、
 実行環境一式が提供されるため、ソースコードさえあればプログラムの実行が可能となります。
●S3はストレージサービスで、今回のlambdaから格納する画像の保存先としています。
 使い方は様々で、かなり柔軟性が高いサービスです。

LambdaやS3についての詳しい解説記事は以下を参照して下さい。


前提条件: AWSアカウントの作成

AWSアカウントをまだお持ちでない方は、公式サイトからアカウントを作成しておきましょう。


2. S3バケットの作成

それでは、早速やっていきましょう。
まずは、先にLambdaから画像をアップロードする S3バケット を作成しておきます。

「S3バケット」はオブジェクトを保存するための領域であると考えて下さい。
「フォルダ」や「ディレクトリ」と似ていますが、S3においてはより高度な管理機能を持っています。

S3を検索し、コンソールへ移動した後、「バケットの作成」を選択します。

様々設定が出てきますが、今回は画像を保存するだけなので、バケット名を入力し、他はデフォルトのまま「バケットの作成」を押下します。

バケットが作成されたことを確認します。

これで、S3の設定は完了です!とても簡単ですね。

3. Lambda関数の作成

新しいLambda関数を作成

続いて、Lambdaコンソールにアクセスし、「関数の作成」をクリックします。
本記事のメインとなる部分です。

関数名を入力し、Python 3.12 をランタイムとして選択します。


言語は後からでも変更可能です。

4. コードの実装

関数の作成ができたら、コードを実装していきましょう。
今回は、boto3ライブラリを使ってS3に画像をアップロードします。

boto3とは、Python でAWSを操作するためのライブラリです。
boto3を利用することで、PythonのアプリケーションをAWSの各サービスと容易に統合することができます。
→詳しくは、公式ページへ。

アップロード元となる画像をLambdaに配置

本来、Lambda上にupload対象の画像を置くことはほぼなく、APIやS3と連携することが一般的かと思いますが、今回は(面倒くさいので) Lambda上に配置してしまいます。

先ほど作成した関数のページへ移動し、「コード」をクリックします。

画像の辺りを右クリックして、適当な画像をuploadします。

ファイル名は、「sample.png」としました。

Lambda関数コード

サンプル画像も用意できたので、コードを実装していきましょう。

右側のエディターに、コードを書いていきます。

import base64
import boto3

def lambda_handler(event, context):
    # アップロード元のファイルパス
    local_file_path = '/sample.png'  # uploadした画像
    # アップロード先のS3バケット名とファイル名
    bucket_name = 'your-bucket-name'  #作成したS3のバケット名
    s3_file_key = 'uploaded-image.png'
    
    # S3 クライアントを初期化
    s3 = boto3.client('s3')
    
    try:
        # 画像をS3にアップロード
        s3.upload_file(local_file_path, bucket_name, s3_file_key)
        
        # 成功メッセージを返す
        return {
            'statusCode': 200,
            'body': 'Image uploaded successfully to S3!'
        }
    
    except Exception as e:
        # エラーが発生した場合の処理
        print(e)
        return {
            'statusCode': 500,
            'body': f'Failed to upload image: {str(e)}'
        }

コードの解説

  • local_file_path: Lambda関数内の画像のパスです。アップロードした画像のパスを指定して下さい。
  • bucket_name: アップロード先のS3バケット名です。アップロードする際にアクセス可能なバケットを指定してください。
  • s3_file_key: S3内での保存名です。ファイル名やパスを指定できます。
  • s3.upload_file(): ローカルファイルを直接S3にアップロードするboto3のメソッドです。

ここまで終わったら「deploy」ボタンを押します。


5. IAMロールの設定

ここまで終わったら、後一息です!

LambdaからS3にアクセスするためには、Lambda 関数の実行ロールからS3バケットへのアクセスが許可されている必要があります。

まずは、設定タブからロールへと移動します。

「許可を追加」を選択し、「AmazonS3FullAccess」を選択し「許可を追加」をクリックします。

これで、Lambda からS3へのアクセスが許可された状態になりました!

6. 動作確認

テストイベントの設定

今回は、手動実行となるので、Lambdaコンソールからテストボタンを押下します。

まずは、テストイベントを作成します。

テストイベントは任意の名前を、テンプレートは「Hello World」を選択します。

テストイベントの作成が完了したら、「deploy」の下の「Test」ボタンをクリックし、先ほど作成したtestイベントをクリックします。

アウトプットに、status code「200」が表示されたら、完了です!

S3へと移動し、画像が格納されているか、確認してみて下さい。
無事格納されていれば、OKです!

7. まとめ

この記事では、AWS Lambdaを使って画像をS3にアップロードする方法を解説しました。

今回は手動実行で行ったので、トリガーの設定もぜひ試してみて下さい!

コメント

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