LoginSignup
0
2

More than 1 year has passed since last update.

GoでS3の署名付きURLを作成

Posted at

意外と見つけるまで時間がかかってしまったのでメモです。

参考

公式ドキュメントです。

前提

  • AWSの認証情報が環境変数として登録されている
export AWS_ACCESS_KEY_ID=yyyyy
export AWS_REGION=ap-northeast-1
export AWS_SECRET_ACCESS_KEY=xxxxxx

コード

main.go
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX - License - Identifier: Apache - 2.0
package main

import (
    "context"
    "flag"
    "fmt"

    v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

// S3PresignGetObjectAPI defines the interface for the PresignGetObject function.
// We use this interface to test the function using a mocked service.
type S3PresignGetObjectAPI interface {
    PresignGetObject(
        ctx context.Context,
        params *s3.GetObjectInput,
        optFns ...func(*s3.PresignOptions)) (*v4.PresignedHTTPRequest, error)
}

// GetPresignedURL retrieves a presigned URL for an Amazon S3 bucket object.
// Inputs:
//     c is the context of the method call, which includes the AWS Region.
//     api is the interface that defines the method call.
//     input defines the input arguments to the service call.
// Output:
//     If successful, the presigned URL for the object and nil.
//     Otherwise, nil and an error from the call to PresignGetObject.
func GetPresignedURL(c context.Context, api S3PresignGetObjectAPI, input *s3.GetObjectInput) (*v4.PresignedHTTPRequest, error) {
    return api.PresignGetObject(c, input)
}

func main() {
    bucket := flag.String("b", "", "The bucket")
    key := flag.String("k", "", "The object key")

    flag.Parse()

    if *bucket == "" || *key == "" {
        fmt.Println("You must supply a bucket name (-b BUCKET) and object key (-k KEY)")
        return
    }

    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
        panic("configuration error, " + err.Error())
    }

    client := s3.NewFromConfig(cfg)

    input := &s3.GetObjectInput{
        Bucket: bucket,
        Key:    key,
    }

    psClient := s3.NewPresignClient(client)

    resp, err := GetPresignedURL(context.TODO(), psClient, input)
    if err != nil {
        fmt.Println("Got an error retrieving pre-signed object:")
        fmt.Println(err)
        return
    }

    fmt.Println("The URL: ")
    fmt.Println(resp.URL)
}

コマンド

go run presigned/main.go -b my-bucket -k photo.png
The URL:
https://xxxx.s3.ap-northeast-1.amazonaws.com/photo.png?X-Amz-Algorithm=......
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2