AWS 秘密和参数 Lambda 扩展抛出未准备好提供流量服务

I C*_*rti 5 amazon-web-services aws-lambda aws-lambda-extensions

我正在尝试使用 AWS 参数和秘密 Lambda 扩展。从文档来看,看起来很简单,只需将 GET 请求发送到 localhost:2773 并附加标头 AWS 会话令牌即可。我尝试过,但它给了我not ready to serve traffic, please wait

奇怪的是,上面我已经可以看到服务器实际上已准备好提供流量服务[AWS Parameters and Secrets Lambda Extension] 2023/03/03 08:05:50 INFO ready to serve traffic

我的代码在 Golang 中:

// Using Lambda Extensions to get SSM Parameters and Secrets Manager env vars
func LoadEnvVarsFromLambdaExtension() {
    paramsSecretsExtensionHttpPort := utils.GetEnv("PARAMETERS_SECRETS_EXTENSION_HTTP_PORT", "2773")
    awsSessionToken := utils.GetEnv("AWS_SESSION_TOKEN", "")

    ssmParamsUrl := "http://localhost:" + paramsSecretsExtensionHttpPort + "/systemsmanager/parameters/get?name="
    urlWithDecryption := "&withDecryption=true"
    secretsUrl := "http://localhost:" + paramsSecretsExtensionHttpPort + "/secretsmanager/get?secretId="

    internalApiTokenSSMPath := utils.GetEnv("INTERNAL_API_TOKEN", "")
    jwtSecretSSMPath := utils.GetEnv("JWT_SECRET", "")
    redisSecretPath := utils.GetEnv("REDIS_SECRETS_ARN", "")

    internalApiTokenGetUrl := ssmParamsUrl + internalApiTokenSSMPath + urlWithDecryption
    jwtSecretGetUrl := ssmParamsUrl + jwtSecretSSMPath + urlWithDecryption
    redisGetUrl := secretsUrl + redisSecretPath

    EnvSettings.InternalAPIToken, _ = httpGet(internalApiTokenGetUrl, awsSessionToken)
    EnvSettings.JwtSecret, _ = httpGet(jwtSecretGetUrl, awsSessionToken)
    EnvSettings.RedisSecret, _ = httpGet(redisGetUrl, awsSessionToken)
}


// http GET request with headers
func httpGet(url string, awsSessionToken string) (string, error) {
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Error(errors.Wrap(err, "Error creating request"))
    }

    req.Header.Set("X-Aws-Parameters-Secrets-Token", awsSessionToken)

    client := &http.Client{
        Timeout: time.Second * 10,
    }

    resp, err := client.Do(req)
    if err != nil {
        log.Error(errors.Wrap(err, "Error sending request"))
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Error(errors.Wrap(err, "Error reading body"))
    }
    
    return string(body), nil
}
Run Code Online (Sandbox Code Playgroud)

我只是在主函数中运行它,首先进行设置

func main() {
    lambdaUtils.LoadEnvVarsFromLambdaExtension()
    lambda.Start(HandleRequestTest)
}

func HandleRequestTest(ctx context.Context) (string, error) {
    fmt.Println(lambdaUtils.EnvSettings.InternalAPIToken)
    fmt.Println(lambdaUtils.EnvSettings.JwtSecret)
    fmt.Println(lambdaUtils.EnvSettings.RedisSecret)

    return lambdaUtils.EnvSettings.RedisSecret, nil
}

Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒。谢谢。

I C*_*rti 5

没关系。我只是愚蠢地认为调用是在 lambda 处理程序之前进行的,因此当尝试加载 lambda 扩展时,它显然尚未准备好。

它应该是:

func HandleRequestTest(ctx context.Context) (string, error) {
    lambdaUtils.LoadEnvVarsFromLambdaExtension()
    fmt.Println(lambdaUtils.EnvSettings.InternalAPIToken)
    fmt.Println(lambdaUtils.EnvSettings.JwtSecret)
    fmt.Println(lambdaUtils.EnvSettings.RedisSecret)

    return lambdaUtils.EnvSettings.RedisSecret, nil
}
Run Code Online (Sandbox Code Playgroud)

但实际上,这并不能解决我获取参数和秘密管理器的问题,因为我的 lambda 位于 VPC 内部,除非提供 NAT 网关,否则无法访问互联网。