我有一个 AWS Lambda(java),我尝试进行测试以检索存储在 Parameter Store 上的密码。这是我的一段代码:
GetParameterRequest parameterRequest = new GetParameterRequest();
AWSSimpleSystemsManagement client = AWSSimpleSystemsManagementClientBuilder.defaultClient();
parameterRequest.withName("my-password-key")
.setWithDecryption(true);
GetParameterResult parameterResult = client.getParameter(parameterRequest);
password = parameterResult.getParameter().toString();
Run Code Online (Sandbox Code Playgroud)
与我的 lambda 关联的(security group和NACL)已打开所有入站和出站(任何端口和任何 IP 地址)。
我的 lambda 在私有子网内运行。
当我执行 lambda(由 API 网关事件触发)时,出现以下错误:
Unable to execute HTTP request: Connect to ssm.eu-central-1.amazonaws.com:443 [ssm.eu-central-1.amazonaws.com] failed: connect timed out: com.amazonaws.SdkClientException
Run Code Online (Sandbox Code Playgroud)
由于该错误是关于超时错误,因此我认为这不是角色问题。
我不知道该去哪里看。任何帮助表示赞赏。
谢谢。
抄送
我创建了一个lambda和云形成模板,该模板向lambda授予对参数存储和秘密管理器的访问权限。当我测试lambda时,我在export.handler函数之外具有以下函数:
function getParameterFromStore(param){
let promise = new Promise(function(resolve, reject){
console.log('++ ' + param.Path);
servmgr.getParametersByPath(param, function(err, data){
if(err){
reject(console.log('Error getting parameter: ' + err, err.stack));
} else {
resolve(data);
}
});
});
let parameterResult = promise.then(function(result){
console.log('---- result: '+ JSON.stringify(result));
return result;
});
return parameterResult;
};
Run Code Online (Sandbox Code Playgroud)
servmgr 被实例化为 var servmgr = new AWS.SSM();
当我从export.handler函数调用此函数时,我这样做是:
myFirstParam = { Path : '/myPath/Service/servicesEndpoint'};
let endpointResult = getParameterFromStore(myFirstParam);
Run Code Online (Sandbox Code Playgroud)
在lambda中,我有一个函数来检索包装在promise中的export.handler函数bt之外定义的参数。
当我运行/测试此lambda时,返回的对象始终是未定义的……我得到Parameters [],但没有值。
2019-02-20T21:42:41.340Z 2684fe88-d552-4560-a477-6761f2de6717 ++ /myPath/Service/serviceEndpoint
2019-02-20T21:42:41.452Z 2684fe88-d552-4560-a477-6761f2de6717 ---- result: {"Parameters":[]}
Run Code Online (Sandbox Code Playgroud)
如何在运行时如何将参数值返回给lambda?
更新
基于Thales的建议/答案,我将lambda简化为:
const getParameterFromStoreAsync …Run Code Online (Sandbox Code Playgroud) 我发现 AWS 为 Parameter Store 描述的以下限制。
Default throughput: 40 (Shared by the following API actions: GetParameter, GetParameters, GetParametersByPath)
Higher throughput: 100 (GetParametersByPath)
Higher throughput: 1000 (Shared by the following API actions: GetParameter and GetParameters)
For more information about Parameter Store throughput, see Increasing Parameter Store Throughput in the AWS Systems Manager User Guide.
Run Code Online (Sandbox Code Playgroud)
我想知道限制是针对单个密钥还是针对整个 Parameter Store 服务(每个帐户或区域)
我有以下使用无服务器框架项目的 serverless.yml 文件创建的队列:
resources:
Resources:
myAppSQSQueue:
Type: "AWS::SQS::Queue"
Properties:
QueueName: "my-app-sqs-queue-${opt:stage, self:provider.stage}"
Run Code Online (Sandbox Code Playgroud)
如何获取创建的队列的 URL 并将其作为参数存储在 AWS Systems Manager 中?我需要将其存储在那里,以便该应用程序之外的其他应用程序知道如何访问它。
我有一个带有节点的 lambda,对于本地部署,我使用 SAM CLI。此 lambda 需要 SSM 参数存储中的一些参数才能连接到数据库。除了区域之外,我还配置了 AWS_ACCES_KEY_ID 和 AWS_SECRET_ACCESS_KEY 作为环境变量。当执行本地 lamda 时,我没有收到任何错误,因为它转到了 aws,但它没有给我带来任何东西。这不是代码问题,因为如果我已经将其部署在 aws 中,它就可以正常工作。我不知道是否需要进行其他配置才能使其工作。
模板.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
ciencuadras-appraisal-request
Sample SAM Template for ciencuadras-appraisal-request
Parameters:
Stage:
Type: String
Default: dev
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
ApiDeployment:
Type: AWS::Serverless::Api
Properties:
StageName: !Ref Stage
RequestAppraisalFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: dist/
Handler: main.handler
Runtime: nodejs14.x
Environment:
Variables:
AWS_REGION: 'us-east-1'
Events:
RequestAppraisal:
Type: Api # …Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js aws-lambda aws-sam-cli aws-parameter-store
我尝试使用 aws-sdk-mock 和下面的代码来模拟 AWS SSM,但不起作用。不抛出错误,从实际存储中获取值getParametersByPath调用时从实际存储中获取值。
我查看了 aws-sdk-mock 文档,但似乎没有模拟 ssm 的示例,是否支持。
AWSMock.mock('SSM', 'getParametersByPath', (params, callback) => {
callback(null, mockResponse);
});
Run Code Online (Sandbox Code Playgroud) 我在我的 aws lambda 中使用 javascript,它调用 SSM getParameter,并且 lambda 的执行角色对我想要获取其值的密钥具有适当的权限。
最初,我收到了这个特定的错误:
ERROR AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:parameter/my/parameter
Run Code Online (Sandbox Code Playgroud)
具体错误是有道理的,因此我更正了我的策略,因为我不小心将 GetParameters 放在了 GetParameters 中。但现在,我收到了这个可疑的错误(请注意末尾的*):
ERROR AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:*
Run Code Online (Sandbox Code Playgroud)
这个错误对我来说没有任何意义。为什么我需要访问每个参数?我只需要我想要的那个。
这是相关代码:
ERROR AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:parameter/my/parameter
Run Code Online (Sandbox Code Playgroud)
以及权限策略(在 CloudFormation 模板中创建)
ERROR AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:*
Run Code Online (Sandbox Code Playgroud)
更改权限策略以匹配错误消息后,我现在遇到这个奇怪的错误:
ERROR ValidationException: Parameter name: can't be …Run Code Online (Sandbox Code Playgroud) javascript amazon-web-services aws-lambda aws-parameter-store
根据需求,我们希望在 SSM 参数存储中存储一个参数,并且应该能够通过 SSM 命令更新参数值。
从初步研究来看,我们可以在 Target EC2 实例上运行 SSM 命令。但是无法找到以目标作为参数存储来运行命令的方法。请帮忙。
aws-lambda ×4
aws-ssm ×2
amazon-sqs ×1
aws-sam-cli ×1
aws-sdk-mock ×1
javascript ×1
jestjs ×1
node.js ×1
promise ×1
ssm ×1