问题描述
使用最新的 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 (将#修改为@)