下の記事の続きです。
今回は Go で書いた Lambda Function から AWS のリソースを触れるようにしたいなー、ということで「S3 バケットの一覧を取得」するまでの流れを書いていきたいと思います。
aws-sdk-go の導入
go get -u github.com/aws/aws-sdk-go
します。
ソースコードの修正
aws-sdk-go
の利用宣言- S3 バケット一覧の取得
をします。後者は AWS 公式サンプルからほぼそのまま持ってきています。(サンプルたくさんある。良さそう。あとでじっくり見よう。)
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: "*"
ビルド&実行
動きました:)
まとめ
さて次は何をしようかな:D