[AWS Associate] 1.Lambda

1. 背景: S3にアップロードするWebを作成する 2. 構成: ① クライアントからAPIGatewayにアクセスする ② Lambda機能をコールする ③ クライアントがアップロードするファイルをS3に書き込む 3. 処理概要: クライアントからファイル名存在しているかをチェックするリクエストを送る サーバーはpresigned_urlを作成し返却する 貰ったpresigned_urlによりファイルをアップロード実行する 4. 作成手順: Step1: HTMLFrontEndを作成 Step2: Lambda変数を作成 ① 変数名 ② Lambda書く言語を選択 ③ 選択するロールの権限でLambda作成 Step3: Lambdaコード書く ① GETステートメントであればユーザーから送るファイル名が存在しているかをチェックする if event['httpMethod'] == 'GET': #1 ユーザーから送ったファイル名を取得し処理する fileName = event['queryStringParameters']['fileNameOfCSV'] # どのフォルダーをチェック対象にする変数 bucket = "XXX" prefix = "YYY/" try : s3Objects = s3.list_objects(Bucket=bucket, Prefix=prefix)

1. 背景:

S3にアップロードするWebを作成する

2. 構成:

① クライアントからAPIGatewayにアクセスする
② Lambda機能をコールする
③ クライアントがアップロードするファイルをS3に書き込む

3. 処理概要:

  1. クライアントからファイル名存在しているかをチェックするリクエストを送る
  2. サーバーはpresigned_urlを作成し返却する
  3. 貰ったpresigned_urlによりファイルをアップロード実行する

4. 作成手順:

Step1: HTMLFrontEndを作成

image.png

Step2: Lambda変数を作成

① 変数名
② Lambda書く言語を選択
③ 選択するロールの権限でLambda作成

Step3: Lambdaコード書く

① GETステートメントであればユーザーから送るファイル名が存在しているかをチェックする

if event['httpMethod'] == 'GET':
        
        #1 ユーザーから送ったファイル名を取得し処理する
        fileName = event['queryStringParameters']['fileNameOfCSV']
        
        # どのフォルダーをチェック対象にする変数
        bucket = "XXX"
        prefix  = "YYY/"
        try :
            s3Objects = s3.list_objects(Bucket=bucket, Prefix=prefix)
            if 'Contents' in s3Objects:
                keys = [content['Key'] for content in s3Objects['Contents']]
     
                keys.remove(prefix)
                for i in range(0, len(keys)):
                    if keys[i] == (prefix + fileName) :
                        booCheckFileNameIsValid = False
                        break
     
            else:
                booCheckFileNameIsValid = False
        except:
            booCheckFileNameIsValid = False

② POSTステートメントであればpresigned_urlを作成し返却する

 elif event['httpMethod'] == 'POST':
        print("POST")
        #メイン
        csvFromUser = event['body']

        #1 S3に保存する
        bucket = 'XXX'
        data = json.loads(csvFromUser)

        upload_key = 'YYY/' + data['fileNameOfCSV']
        # Generate the presigned URL for put requests
        presigned_url = s3.generate_presigned_url(
            ClientMethod='put_object',
            Params={
                'Bucket': 'XXX',
                'Key': upload_key,
                'ContentType': 'text/csv', 
            }
        )

Step4: APIGateway作成

① トリガーを追加

image.png

② リソース(とメゾンド)を作成

③ ステージを作成

作成したらURLを取得しFrontEndでAPIコール処理にて利用する

5. CORS問題:

実行してみればGETステートメントでCORS問題が発生する

image.png

原因:APIGatewayの方がCORS有効を設定していない。

でも、設定したら再デプロイするとCORS問題まだ発生している

image.png

原因:s3にCORS設定していない。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "HEAD",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "x-amz-request-id",
            "x-amz-id-2",
            "Content-Length",
            "Content-Type",
            "Connection",
            "Server",
            "Etag"
        ],
        "MaxAgeSeconds": 3000
    }
]

設定したら、再度テスト見れば正常にアップロードできました!!!

image.png

6. まとめ:

APIGateWay → Lambda → S3を概要的に紹介した。
一番留意点はCORS問題です。対応方法も記載している。
ソースコードもGithubに上げましたのでご参考のほどお願い致します。

参考資料

参考ソース

Nguồn: viblo.asia

Bài viết liên quan

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th