今年のはじめだったかにLambda FunctionをGoでかけるようになったけど、そもそもLambda Functionを書く機会がなかった
最近個人で作ってるサービスをFargateに移行した時にRailsが入ったDocker Imageを作ったので、せっかくの機会だし定期的にrake taskを実行できるような仕組みを作ろうと思った
定期的なトリガーに関してはCloudWatch Eventのルールを使用する
ターゲットをLambda FunctionにしてそこでECSのTaskを実行する
今回はそのLambda FunctionをGoで書いた
package main import ( "context" "fmt" "os" "github.com/aws/aws-lambda-go/events" "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/ecs" ) func handler(ctx context.Context, cwe events.CloudWatchEvent) error { svc := ecs.New(session.New()) newtworkConf := &ecs.NetworkConfiguration{ AwsvpcConfiguration: &ecs.AwsVpcConfiguration{ AssignPublicIp: aws.String("ENABLED"), SecurityGroups: aws.StringSlice([]string{"sg-aaaaaaaa"}), Subnets: aws.StringSlice([]string{"subnet-aaaaaaa", "subnet-bbbbbbbb"}), }, } taskOverride := &ecs.TaskOverride{ ContainerOverrides: []*ecs.ContainerOverride{ &ecs.ContainerOverride{ Name: aws.String("rake-task"), Command: aws.StringSlice([]string{"bundle", "exec", "rails", "-T"}), }, }, } input := &ecs.RunTaskInput{ Cluster: aws.String("hoge-cluster"), Group: aws.String("hoge-group"), LaunchType: aws.String("FARGATE"), // 実行にはFargateを使用する TaskDefinition: aws.String(os.Getenv("TASK_DEFINITION")), NetworkConfiguration: newtworkConf, Overrides: taskOverride, } result, err := svc.RunTask(input) if err != nil { return err } fmt.Println(result) return nil } func main() { lambda.Start(handler) }
特にポイントはなくてドキュメント見るとそれっぽくかける