Lambda触发的Micronaut应用无法从AWS Secrets Manager获取属性求助
问题概述
当前遇到连接超时错误:
Unable to execute HTTP request: Connect to secretsmanager.eu-central-1.amazonaws.com:443 [secretsmanager.eu-central-1.amazonaws.com/ipaddress, secretsmanager.eu-central-1.amazonaws.com/ipaddress] failed: connect timed out", "errorType": "software.amazon.awssdk.core.exception.SdkClientException"
场景:基于Micronaut的AWS Lambda函数,需从Secrets Manager的/config/micronautguide/details中获取menuEventTest: testingData配置项,现有配置及代码如下:
现有配置与代码
bootstrap.yml
micronaut: config-client: enabled: true application: name: micronautguide aws: secretsmanager: secrets: - secret-name: /config/micronautguide/details
application.yml
menuEventTest: ${menuEventTest}
Micronaut代码
public class FunctionRequestHandler extends MicronautRequestHandler<Object, Object> { private static final Logger LOG = LoggerFactory.getLogger(FunctionRequestHandler.class); @Value("${menuEventTest}") private String menuEventTest; @Override public Object execute(Object payload) { LOG.info("Request menuEvent: {} ", menuEventTest); return null; } }
依赖
implementation("io.micronaut.aws:micronaut-aws-secretsmanager") implementation("io.micronaut.aws:micronaut-function-aws")
解决方案
1. 修正Lambda网络配置(核心解决超时问题)
超时的核心原因是Lambda无法访问Secrets Manager的端点,分两种情况处理:
- Lambda配置了VPC:
- 给VPC添加Secrets Manager的Interface类型VPC端点(服务名称
com.amazonaws.eu-central-1.secretsmanager),确保子网能通过内网访问Secrets Manager。 - 确保Lambda所在安全组允许出站443端口到VPC端点的IP范围。
- 给VPC添加Secrets Manager的Interface类型VPC端点(服务名称
- 无需VPC:
- 将Lambda的VPC配置改为无VPC,默认Lambda有访问AWS公共服务的权限,可直接连接Secrets Manager。
2. 配置正确的IAM权限
给Lambda执行角色添加Secrets Manager读取权限,示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:eu-central-1:<你的账号ID>:secret:/config/micronautguide/details-*" } ] }
注意:Secret的ARN后缀可能带有随机字符,需匹配实际ARN。
3. 优化Micronaut配置
- 显式指定AWS区域,避免自动探测失败:
aws: region: eu-central-1 secretsmanager: secrets: - secret-name: /config/micronautguide/details - 移除
application.yml中冗余的menuEventTest: ${menuEventTest}配置,@Value可直接从Secrets Manager注入值。
4. 确认Secret格式有效性
确保Secrets Manager中的Secret值为JSON格式:
{ "menuEventTest": "testingData" }
纯文本格式无法被Micronaut解析为键值对,必须使用JSON结构。
5. 验证依赖版本兼容性
确保micronaut-aws-secretsmanager、micronaut-function-aws与Micronaut核心版本保持兼容,避免SDK调用异常。
内容的提问来源于stack exchange,提问作者Sriram

