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)
任何帮助都会很棒。谢谢。
没关系。我只是愚蠢地认为调用是在 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 网关,否则无法访问互联网。
| 归档时间: |
|
| 查看次数: |
1497 次 |
| 最近记录: |