0
Help us understand the problem. What are the problem?

posted at

S3バケットに外部からファイルのやり取りを行う(期限付きURL)

AWS外部から特定のS3バケットにあるファイルをダウンロード&アップロードを行いたい

S3の期限付きURLをLambdaにて生成し、URLにアクセスしファイルのダウンロード&アップロードを行う

(補足)
手動でやる場合は、Lambdaを使わずとも、S3バケットにて2クリック程で期限付きURLの作成ができます。
今回は、URLの生成を(ファイル検知などで)自動化したかっため、Lambdaにて作成しました。

(やった手順)
① S3バケットの作成
② Lambdaの作成
③ Lambda(実行ロール)の設定
④ Lambda実行&ダウンロード&アップロード確認

①S3バケットの作成

説明省略。普通に作るだけ。

②Lambdaの作成

(URLをメールで連携したかったので…その処理も含まれています。)
(必要に応じて削除してください)

詰まった点:generate_presigned_urlでURL生成しても、S3ファイルのパスにリージョンが含まれなかった。
・import from 設定
・boto3.client('s3', config=Config(s3={'addressing_style': 'path'}, signature_version='s3v4')) 設定
で解消できた。

import boto3
from botocore.config import Config

S3_BUCKET_NAME = "bucket_name"  # アップロード&ダウンロード先のバケット名
DURATION_SECONDS = 3600         # 有効期限の秒数
DOWNLOAD_FILE = "dounload.zip"  # ダウンロードファイル
UPLOAD_FILE = "upload.zip"      # アップロードファイル (指定することで、適当な名前でアップロードしても、この名前でS3に格納される)

# メール連携部分のため、不要な人は不要
# メール連携用のTOPIC(SNSで設定したarnを指定)
sns = boto3.client('sns')
TOPIC = 'arn:aws:sns:ap-northeast-1:999999999:test-test'

def lambda_handler(event, context):
    
    s3 = boto3.client('s3', config=Config(s3={'addressing_style': 'path'}, signature_version='s3v4'))
    # ダウンロード用URL生成
    download_url = s3.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': S3_BUCKET_NAME,
            'Key': DOWNLOAD_FILE
        },
        ExpiresIn=DURATION_SECONDS,
        HttpMethod='GET'
    )
    print("ダウンロードURL")
    print('-----\n{}\n-----'.format(download_url))
    
    # アップロード用URL
    upload_url = s3.generate_presigned_url(
        ClientMethod='put_object',
        Params={
            'Bucket': S3_BUCKET_NAME,
            'Key': UPLOAD_FILE
        },
        ExpiresIn=DURATION_SECONDS,
        HttpMethod='PUT'
    )
    print("アップロードURL")
    print('-----\n{}\n-----'.format(upload_url))
    # メール連携部分のため、不要な人は不要
    sns.publish(
                TopicArn = TOPIC,
                Message = download_url,
                Subject = 'URL連携')

③Lambda(実行ロール)の設定

(1つ目) いつもの実行ロール → 変更なし
(2つ目) S3アクセス → テスト用でフルアクセス
(3つ目) SNSアクセス → メール用なので、不要の人は不要(テスト用でフルアクセス)
image.png

④Lambda実行&ダウンロード&アップロード確認

(1)Lambda実行
ダウンロード用URLとアップロード用URLがログに出力されたのを確認します
image.png

(2)ダウンロード
(※事前にファイルをS3に格納しています)
そのままURLをブラウザで開きます。ダウンロードできました。
image.png

(※有効期限が切れると、このようになります)
image.png

(3)アップロード
コマンドプロンプトなどで、curlコマンドを打ちます。
今回は、デスクトップのtest.zipをS3にアップロードします。

curl -X PUT --upload-file C:\Users\****-****\Desktop\test.zip "ダウンロード用URL"

(一部隠していますが、エラーなどならなければ、問題なくアップロードできています)
image.png

(4)S3の確認
(3)のファイル(test.zip)がアップロードされ、Lambdaにて設定した(upload.zip)となっていることが確認できました。
image.png

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?