AWS lambda 从 CloudFormation 读取参数或输出
AWS lambda read parameter or outputs from CloudFormation
看起来非常简单的任务,但很难找到好的例子。
因此,任务如下:AWS lambda 将一些消息发送到 AWS-SQS。
AWS lambda 代码包含这样一行:
var QUEUE_URL = 'https://sqs.us-west-2.amazonaws.com/ID/QUEUE_NAME';",
为了摆脱这段代码,有两种可能的选择:
- 创建将根据区域和队列名称查找此队列的查询SQS has predictable names;
- 创建 Cloud Formaion 脚本并在其中指定这些依赖项。
基于周期性触发器 (lambda) 每天会工作多次这一事实,最好指定此依赖性 duting 部署。
总的来说,它看起来像创建了直接的任务和云编队脚本:
"Resources": {
"LF2HNR1": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Description": "This is lambda trigger",
"Handler": "index.myHandler",
"Runtime": "nodejs",
"Timeout": "300",
并且还指定了 lambda 依赖于 SQS 的依赖关系:
"DependsOn": [
"SQSQ562D4"
]
},
"SQSQ562D4": {
"Type": "AWS::SQS::Queue",
"Properties": {},
}
然而,如何在 lambda 代码中以编程方式获取 SQS url 并不是一件容易的事:
exports.handler = function(event, context) {
var params = {
MessageBody: JSON.stringify(event),
var QUEUE_URL = ????
我建议您检索 SQS URL
并将其用作 CloudFormation
输出:
"Outputs" : {
"SQSQ562D4" : {
"Description" : "URL of the source queue",
"Value" : { "Ref" : "SQSQ562D4" }
}
}
授予您的 Lambda
函数 cloudformation:DescribeStacks
读取 CloudFormation
堆栈输出的权限,并在 运行 时间将此输出加载到您的代码中以访问 SQS URL
.
编辑:不要使用以下答案中的方法。它在函数 运行 时间加载资源配置(队列 URI),而不是在 Lambda 函数部署时注入它。下面的方法会增加延迟,可能会出现 AWS 服务速率限制的随机问题,并且可能取决于 AWS CloudFormation API。
主要的复杂性在于正确使用 CloudFormaion API 来获取 SQS URL。
为了做到这一点,我使用了以下主要由 API:
驱动的代码
var queueURL;
cloudFormation.describeStackResource(cloudFormationParams, function(err, data) {
if (err){
console.log(err, err.stack); // an error occurred
}
else {
var queueURL =data.StackResourceDetail.PhysicalResourceId;
var params = {
MessageBody: JSON.stringify(event),
QueueUrl: queueURL
};
sqs.sendMessage(params, function(err,data){
if(err) {
context.done('error', "ERROR Put SQS"); // ERROR with message
}else{
console.log('data:',data.MessageId);
context.done(null,''); // SUCCESS
}
});
看起来非常简单的任务,但很难找到好的例子。
因此,任务如下:AWS lambda 将一些消息发送到 AWS-SQS。
AWS lambda 代码包含这样一行:
var QUEUE_URL = 'https://sqs.us-west-2.amazonaws.com/ID/QUEUE_NAME';",
为了摆脱这段代码,有两种可能的选择:
- 创建将根据区域和队列名称查找此队列的查询SQS has predictable names;
- 创建 Cloud Formaion 脚本并在其中指定这些依赖项。
基于周期性触发器 (lambda) 每天会工作多次这一事实,最好指定此依赖性 duting 部署。
总的来说,它看起来像创建了直接的任务和云编队脚本:
"Resources": {
"LF2HNR1": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Description": "This is lambda trigger",
"Handler": "index.myHandler",
"Runtime": "nodejs",
"Timeout": "300",
并且还指定了 lambda 依赖于 SQS 的依赖关系:
"DependsOn": [
"SQSQ562D4"
]
},
"SQSQ562D4": {
"Type": "AWS::SQS::Queue",
"Properties": {},
}
然而,如何在 lambda 代码中以编程方式获取 SQS url 并不是一件容易的事:
exports.handler = function(event, context) {
var params = {
MessageBody: JSON.stringify(event),
var QUEUE_URL = ????
我建议您检索 SQS URL
并将其用作 CloudFormation
输出:
"Outputs" : {
"SQSQ562D4" : {
"Description" : "URL of the source queue",
"Value" : { "Ref" : "SQSQ562D4" }
}
}
授予您的 Lambda
函数 cloudformation:DescribeStacks
读取 CloudFormation
堆栈输出的权限,并在 运行 时间将此输出加载到您的代码中以访问 SQS URL
.
编辑:不要使用以下答案中的方法。它在函数 运行 时间加载资源配置(队列 URI),而不是在 Lambda 函数部署时注入它。下面的方法会增加延迟,可能会出现 AWS 服务速率限制的随机问题,并且可能取决于 AWS CloudFormation API。
主要的复杂性在于正确使用 CloudFormaion API 来获取 SQS URL。
为了做到这一点,我使用了以下主要由 API:
驱动的代码 var queueURL;
cloudFormation.describeStackResource(cloudFormationParams, function(err, data) {
if (err){
console.log(err, err.stack); // an error occurred
}
else {
var queueURL =data.StackResourceDetail.PhysicalResourceId;
var params = {
MessageBody: JSON.stringify(event),
QueueUrl: queueURL
};
sqs.sendMessage(params, function(err,data){
if(err) {
context.done('error', "ERROR Put SQS"); // ERROR with message
}else{
console.log('data:',data.MessageId);
context.done(null,''); // SUCCESS
}
});