Go on AWS Lambda から AWS リソースを操作する

 下の記事の続きです。

www.ketancho.net

今回は Go で書いた Lambda Function から AWS のリソースを触れるようにしたいなー、ということで「S3 バケットの一覧を取得」するまでの流れを書いていきたいと思います。

aws-sdk-go の導入

go get -u github.com/aws/aws-sdk-go します。

ソースコードの修正

  • aws-sdk-go の利用宣言
  • S3 バケット一覧の取得

をします。後者は AWS 公式サンプルからほぼそのまま持ってきています。(サンプルたくさんある。良さそう。あとでじっくり見よう。)

github.com

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/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func hello() (string, error) {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("ap-northeast-1")},
    )

    // Create S3 service client
    svc := s3.New(sess)

    result, err := svc.ListBuckets(&s3.ListBucketsInput{})
    if err != nil {
        log.Println("Failed to list buckets", err)
        return "err", nil
    }

    log.Println("Buckets:")

    for _, bucket := range result.Buckets {
        log.Printf("%s : %s\n", aws.StringValue(bucket.Name), bucket.CreationDate)
    }

    return "Hello World!201805", nil
}

func main() {
    // Make the handler available for Remote Procedure Call by AWS Lambda
    lambda.Start(hello)
}

Lambda に割り当てる IAM ロールの変更

 前回用意した template.yaml では、Lambda ファンクションに DynamoDB の権限しか割り当てませんでした。今回は、 DynamoDB ではなく S3 の権限を付与するように変更します。 Policies を修正してください。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Go on Lambda sample.

# SAM Resources
Resources:
  SamSampleLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: sample.zip
      Handler: sample
      Runtime: go1.x
      Role: !GetAtt GoOnLambdaIamRole.Arn
      Timeout: 30
  GoOnLambdaIamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        -
          PolicyName: "s3_for_go_onlambda"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action: "s3:*"
                Resource: "*"

ビルド&実行

 動きました:)

f:id:ketancho_jp:20180528174534p:plain

まとめ

 さて次は何をしようかな:D