[Golang + Lambda + API Gateway]에서 S3 버킷을 만드는 API를 만들어 보았습니다.



전제 조건



2019년 12월 29일에 시도해 보았습니다.
Go 1.12.9

1. Golang 코드를 Lambda에서 실행



필요한 라이브러리 설치


$ go get -u github.com/aws/aws-lambda-go/lambda
$ go get -u github.com/aws/aws-sdk-go/...

지정된 버킷 이름으로 S3 버킷을 만드는 코드



만든 함수는 인수로 받은 버킷 이름으로 S3 버킷을 만들어 그 결과를 로그에 출력하는 것.

hello.go
package main

import (
    "log"

    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

type MyEvent struct {
    BucketName string `json:"bucket_name"`
}

func hello(event MyEvent) {
    // 流れ:認証情報→セッション→S3
    creds := credentials.NewStaticCredentials("AWS_ACCESS_KEY", "AWS_SECRET_ACCESS_KEY", "") //第3引数はtoken
    session, _ := session.NewSession(&aws.Config{
        Credentials: creds,
        Region:      aws.String("ap-northeast-1")},
    )
    svc := s3.New(session)
    resp, _ := svc.CreateBucket(&s3.CreateBucketInput{
        Bucket: aws.String(event.BucketName),
    })
    log.Println(resp) //Lambdaテストの実行結果のログ出力や、CloudWatchのロググループで確認できる
}

func main() {
    lambda.Start(hello)
}

빌드 (크로스 컴파일)하여 zip 파일로 만듭니다.



Lambda에서 실행하려면 일반적으로 go build하는 대신 Linux에서도 작동하도록 크로스 컴파일 설정을 추가해야합니다.
$ GOOS=linux GOARCH=amd64 go build -o hello
$ zip handler.zip ./hello

zip 파일을 Lambda에 업로드


  • Lambda 콘솔에서 함수를 만들고 위에서 만든 ZIP 파일을 업로드
  • Lambda 함수 코드의 핸들러는 생성 된 함수 이름과 일치합니다 (이 기사에서는 hello)
  • 잊지 않고 저장 버튼

  • 테스트(동작 확인)


  • 람다 콘솔의 테스트 이벤트 설정 화면에서 다음 json 데이터를 입력하십시오.
  • S3 버킷명이 되기 위해서(때문에), 고유한 이름을 지정
  • {
      "bucket_name": "test191229" 
    }
    
  • S3 콘솔에서 지정된 버킷 이름으로 만들어졌는지 확인
  • 로그 출력을 확인 → 성공하면 "Location"(S3 URL)이 반환됩니다.

    2. API Gateway에서 API 생성


  • API 게이트웨이 콘솔에서 "API 만들기"→ REST API의 "빌드"버튼
  • API 이름을 입력하고 API 생성
  • 액션 → 「리소스의 작성」(리소스명은, 액세스하는 패스가 되기 때문에 주의)
  • 액션 → 「메소드의 작성」(GET를 지정해, 만든 Lambda 함수를 지정)
  • 메소드 요청 → URL 쿼리 문자열 매개 변수 추가 (bucket_name)
  • 매핑 템플릿 추가(Content-Type:application/json)
  • 템플릿 생성 → empty로 설정하고 다음을 입력하십시오
  • #set($inputRoot = $input.path('$'))
    {
        "bucket_name" : "$input.params('bucket_name')"
    }
    

    ※ 상기가, 작성한 hello 함수의 인수로서 들어온다

    $input.params(x)
    파라미터명 캐릭터 라인 x 가 지정되었을 경우에, 패스, 쿼리 캐릭터 라인, 또는 헤더치로부터 (이 순서로 검색되는) 메소드 리퀘스트 파라미터의 값을 돌려줍니다.

    매핑 템플릿에서 사용할 수있는 변수 및 함수
    htps : // / cs. 아 ws. 아마존. 이 m/그럼_jp/아피가테와y/ぁてst/로ゔぇぺぺ구이데/아피가테와 y-맘핑g-ㅜぁ테-레후페렌세. html #인프 tゔぁ리아bぇ-레후페렌세

    8. 마지막으로, 액션 → API 배포

    액세스할 URL


  • API 배포 후 Lambda 콘솔에 표시되는 URL을 사용합니다.
  • 예를 들어, 스테이지명이 「stage」, 자원명이 「myresource」, 「URL 쿼리 캐릭터 라인 파라미터」가 「bucket_name」의 경우,
    URL/stage/myresource?bucket_name = test191230
  • 여기에 액세스하면 "test191230"이라는 S3 버킷이 생성됩니다.

    참고로 한 기사



    AWS Lambda에서 Go를 사용할 수 있기 때문에 시도했습니다.
    golang + Lambda + API Gateway에서 REST API를 만들어 보았습니다.
    AWS SDK for Go S3 버킷 기본 작업
  • 좋은 웹페이지 즐겨찾기