今更ながらGoでLambda Functionを書いてECSのTaskを実行する

今年のはじめだったかにLambda FunctionをGoでかけるようになったけど、そもそもLambda Functionを書く機会がなかった

dev.classmethod.jp

最近個人で作ってるサービスを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)
}

特にポイントはなくてドキュメント見るとそれっぽくかける

docs.aws.amazon.com