通过 Go SDK 的 Lambda@Edge

Lambda@Edge through Go SDK

我正在尝试使用 AWS Go SDK 关联 Lambda@Edge 函数。

  1. 在控制台中手动创建函数 使用 SDK 将其分配给 Cloudfront 发行版 => 有效.

  2. 在代码中创建函数(使用与 1. 相同的 IAM 角色)w/o 分配给云端 => works.

  3. 在控制台中手动分配 2. 创建的函数 => 失败.

  4. 通过 SDK 分配 2. 创建的函数 => 失败.

  5. 在 lambda 控制台中手动部署从 2. 创建的函数(操作 => 部署到 lambda@edge)=> works。 => 在此之后,可以手动和通过代码分配函数 w/o 问题...

3.和4.的错误是一样的:

InvalidLambdaFunctionAssociation: Lambda@Edge cannot retrieve the specified Lambda function. Update the IAM policy to add permission: lambda:GetFunction for resource: arn:aws:lambda:us-east-1:123456789:function:example:1 and try again.

让我感到困惑的是,我正在重用在 1 期间创建的相同角色。

这是我通过代码创建函数的方式:

lam := lambda.New(session)
lam.CreateFunction(&lambda.CreateFunctionInput{
    FunctionName: aws.String("example"),
    Handler:      aws.String("index.handler"),
    Runtime:      aws.String("nodejs12.x"),
    Role:         aws.String("arn:aws:iam::123456:role/service-role/existing-role"),
    Code: &lambda.FunctionCode{
        S3Bucket: aws.String("bucket-xyz"),
        S3Key:    aws.String("source.zip"),
    },
}) // works w/o issues

lam.AddPermission(&lambda.AddPermissionInput{
    FunctionName: aws.String("example"),
    StatementId:  aws.String("AllowExecutionFromCloudFront"),
    SourceArn:    aws.String("arn:aws:cloudfront::12333456:distribution/CDNID1234"),
    Principal:    aws.String("edgelambda.amazonaws.com"),
    Action:       aws.String("lambda:GetFunction"),
}) // also works w/o error

// assigning the created lambda function would now fail

使用

1.13

github.com/aws/aws-sdk-go v1.31.8

我发现了问题。

该错误与实际问题完全无关。如果你问我,这是非常具有误导性的错误。

所缺少的只是手头的 lambda 函数的发布版本。

要使用 Go SDK 实现这一点,您必须执行以下操作:

lam := lambda.New(session)
lam.PublishVersion(&lambda.PublishVersionInput{
        FunctionName: aws.String("example"),
        Description:  aws.String("Dont forget to publish ;)"),
    })

使用 CLI,您需要执行以下操作:

aws lambda publish-version --function-name example --description "Dont forget to publish"

未发布的功能不能使用其实是有道理的。然而,AWS 的错误并没有真正帮助那里。

希望这可以帮助到任何人!