nomurabbitのブログ

【AWS】LambdaでS3の署名付きURLを取得してみた【C#】

こんにちは!nomurabbitです。
今回は、S3オブジェクトの署名付きURLを
C#のLambdaで取得してみます。

S3へのファイルの出し入れに便利ですよー!

テンプレートの準備

まず、Lambdaのテンプレートを準備します。

.NET Core3.1のテンプレートは、
この記事この記事を参考にしてください。

ソースコード

今回はAWSSDK.S3が必要なので、
nugetでパッケージを追加します。

f:id:nomurabbit:20211113111205p:plain
nuget

ソースコードのポイントは下記の通りです。

public GlbResponseBody GetAction(GlbRequestBody glbRequestBody)
{
    try
    {
        var s3Client = new AmazonS3Client(RegionEndpoint.APNortheast1);
        var request  = new Amazon.S3.Model.GetPreSignedUrlRequest 
        {
            BucketName  = GlbUtil.S3_NOMURABBIT_BLOG_XXX,
            Key         = glbRequestBody.Key,
            Verb        = HttpVerb.GET,
            //Verb        = HttpVerb.PUT,
            Expires     = DateTime.UtcNow.AddMinutes(5)
        };

        string response = s3Client.GetPreSignedURL(request);

        GlbResponseBody glbResponseBody = new GlbResponseBody();

        glbResponseBody.SignedUrl       = response;

        return glbResponseBody;
    }
    catch (System.Exception e)
    {
        throw e;
    }
}

AmazonS3ClientのGetPreSignedURLメソッドの引数が
GetPreSignedUrlRequest のインスタンスになっています。

Verbプロパティを変更することで、
GET、PUTなどのHTTPメソッドに対応できます。

GitHubソースコードを載せていますので、
よろしければ参考にしてください。

github.com

オブジェクトをGETするための署名付きURLを返すプログラムです。

以上でS3オブジェクトの署名付きURLを
Lambdaで取得できると思います。

ところで私、最初この方法知らなくて、
LambdaでS3のオブジェクトをバイナリで読み取って、
クライアントでファイルに書き出す方法なんかを試してました。

ただ、それだとちょっと大きなファイル扱うと
Lambdaの制限に引っかかっちゃいますよね。

当時は何にも知らなかったんで、いろいろ試行錯誤してました。

もし、これからS3使ってアプリ作るぞ!
って方がいたら、署名付きURLを
ぜひ使ってみてください。
では!