Lambda 在 Localstack 中检索 SSM 参数

问题描述

使用最新的 localstack-full Docker 镜像,我存储了一个加密的 SSM 参数,如下所示:

aws --region us-east-1 --endpoint-url=http://localhost:4566 ssm put-parameter --name "dbpassword" --value "secret2" --type "securestring"

然后我在 Go 中实现了一个 lambda,我可以通过 API 网关访问它。实现如下:

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/ssm"
    "log"
    "os"
)

type Event struct {
    Name string `json:"name"`
}

func HandleRequest(ctx context.Context,event Event) (events.APIGatewayProxyResponse,error) {
    theAwsRegion := os.Getenv("AWS_REGION")

    //customresolver := aws.EndpointResolverFunc(func(service,region string) (aws.Endpoint,error) {
    //  return aws.Endpoint{
    //      PartitionID:   "aws",//      URL:           "localhost:4566",//      SigningRegion: "us-east-1",//  },nil
    //})

    theConfig,err := config.LoadDefaultConfig(
        ctx,config.WithRegion(theAwsRegion),//config.WithEndpointResolver(customresolver),)
    if err != nil {
        log.Fatalf("Unable to load SDK config,%v",err)
    }

    ssmClient := ssm.NewFromConfig(theConfig)

    if ssmClient != nil {
        ssmOutput,err := ssmClient.GetParameter(ctx,&ssm.GetParameterInput{Name: aws.String("dbpassword"),WithDecryption: true})

        if err != nil {
            return events.APIGatewayProxyResponse{
                StatusCode:      200,Headers:         map[string]string{"Context-Type": "text/plain"},Body:            "Error occurred getting password",IsBase64Encoded: false,},nil
        }

        thePassword := ssmOutput.Parameter.Value

        return events.APIGatewayProxyResponse{
            StatusCode:      200,Body:            "Got a SSM client " + *thePassword,nil
    }

    return events.APIGatewayProxyResponse{
        StatusCode:      200,Body:            "Failed to obtain SSM client",nil
}

func main() {
    lambda.Start(HandleRequest)
}

但是,一旦引入了对 GetParameter 的调用,lambda 只会响应“{}”。 成功检索到 SSM 客户端。 还有代码注释掉的尝试使用自定义端点解析器,这会产生相同的结果。 Localstack 有问题还是我做错了什么? 使用 AWS CLI 检索参数没有问题。

更新:我尝试通过端口 4566 从 lambda 容器访问 Localstack 容器,并且能够从 Localstack 容器获得响应。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)