无法使用AWS Parameters and Secrets Lambda Extension,请求连接被拒绝
问题描述
已完成AWS Parameters and Secrets Lambda Extension的必要配置:添加对应Layer、在请求头中配置X-Aws-Parameters-Secrets-Token,但调用扩展获取密钥时出现错误:
feign.RetryableException: Connection refused (Connection refused) executing GET http://localhost:2773/secretsmanager/get?secretId=test
使用Feign Client发起GET请求,session token正常,相关代码和CloudFormation配置如下:
相关代码实现
// SecretsAndParametersExtensionAPI class (API class for Feign Client) @Headers({"X-Aws-Parameters-Secrets-Token: {token}"}) public interface SecretsAndParametersExtensionAPI { // TODO move me @RequestLine("GET /secretsmanager/get") @Headers("X-Aws-Parameters-Secrets-Token: {token}") String getSecret(@Param("token") String token, @QueryMap Map<String, Object> queryMap); } // Test class to get Secrets by using AWS Secrets Parameters Lambda Extension @Test public void testSecretsExtension() { String sessionToken = EnvVarCommon.SESSION_TOKEN.get(); System.out.println(sessionToken); try { SecretsAndParametersExtensionAPI secretsAndParametersExtensionAPI = Feign.builder().target(SecretsAndParametersExtensionAPI.class, "http://localhost:2773/"); Map<String, Object> queryMap = new HashMap<>(); queryMap.put("secretId", "test"); String resultFromSecretExtension = secretsAndParametersExtensionAPI.getSecret(sessionToken, queryMap); System.out.println("Result From Secret Extension " + resultFromSecretExtension); log.debug("Request sent to ULH and ULH send request to LAVIN to download profile picture"); } catch (IllegalStateException | JsonSyntaxException exception) { log.error( "Failed to get response from ULH for downloading profile picture for the UserID '{}'", exception); } }
CloudFormation配置(template.yml)
Mappings: RegionToLayerArnMap: us-east-1: "LayerArn": "arn:aws:lambda:us-east-1:177933569100:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2" us-east-2: "LayerArn": "arn:aws:lambda:us-east-2:590474943231:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2" eu-west-1: "LayerArn": "arn:aws:lambda:eu-west-1:015030872274:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2" eu-west-2: "LayerArn": "arn:aws:lambda:eu-west-2:133256977650:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2" eu-west-3: "LayerArn": "arn:aws:lambda:eu-west-3:780235371811:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2" AlperTestBotLambda: Type: AWS::Serverless::Function Condition: EnableAlperTestbot Properties: Tracing: Active Runtime: java11 Environment: Variables: component: !Ref Component componentShortName: !Ref ComponentShortName version: !Ref Version zone: !Ref Zone tenant: !Ref Tenant testTenant: "test" alperTestQueueName: !Ref AlperTestQueueName aws.sessionToken: !Ref SessionToken Policies: - !Ref SecureParameterAccess - !Ref PurgeSqsPolicyTestQueues EventInvokeConfig: MaximumRetryAttempts: 0 Layers: - !FindInMap [ RegionToLayerArnMap, !Ref "AWS::Region", LayerArn ]
排查方向
1. 测试环境不匹配
Lambda Extension是运行在Lambda容器内部的本地服务,仅能在Lambda执行环境中访问。如果你的testSecretsExtension单元测试是在本地IDE/环境运行,而非部署到Lambda上执行,localhost:2773不存在,必然触发连接拒绝。
解决:将代码部署到Lambda环境测试,或使用SAM Local等工具模拟Lambda执行环境,确保Extension能被正确加载。
2. Extension Layer版本或Region问题
你使用的是版本2的Layer,属于较旧版本,建议升级到最新稳定版;同时确认当前部署的AWS Region在RegionToLayerArnMap映射范围内,避免Region不匹配导致Layer加载失败。
3. Lambda角色权限不足
检查SecureParameterAccess策略是否包含访问目标Secret的权限:
- 需允许
secretsmanager:GetSecretValue操作,资源为arn:aws:secretsmanager:<region>:<account-id>:secret:test-*(注意Secret ARN后缀可能带随机字符) - 需同时包含
secretsmanager:DescribeSecret等必要权限
4. Feign Client配置冗余
你的SecretsAndParametersExtensionAPI接口中,接口类和方法上重复添加了X-Aws-Parameters-Secrets-Token头,虽不会直接导致连接拒绝,但可能引发头重复问题,建议仅保留一处配置。
另外确认EnvVarCommon.SESSION_TOKEN.get()获取的是Lambda环境变量AWS_SESSION_TOKEN(Lambda临时会话令牌的环境变量名是大写下划线格式)。
5. Extension未完成初始化
Lambda Extension需要时间初始化,如果函数在Extension启动完成前发起请求,会导致连接拒绝。可以在代码中添加短暂重试逻辑,或查看Lambda日志中是否有Extension xxx started successfully类的启动成功日志。
6. VPC网络限制(若配置了VPC)
如果Lambda函数配置了VPC,需确认所在安全组允许内部访问本地端口2773(Extension是本地服务,VPC通常不影响,但需排除特殊网络限制)。
内容的提问来源于stack exchange,提问作者Tonyukuk

