const dependencies: AmplifyDependentResourcesAttributes =
AmplifyHelpers.addResourceDependency(
this,
amplifyResourceProps.category,
amplifyResourceProps.resourceName,
[
{
category: 'function',
resourceName: 'usersimulation',
},
{
category: 'function',
resourceName: 'marketprocessor',
}
]
)
const userSimulationLambdaArn = cdk.Fn.ref(
dependencies.function.usersimulation.Arn
)
const marketMessageProcessorArn = cdk.Fn.ref(
dependencies.function.marketprocessor.Arn
)
let sqs = new cdk.aws_sqs.Queue(this, 'sqs', {
queueName: 'sqs_queue_' + cdk.Fn.ref('env'),
})
let sqs_evensource = new cdk.aws_lambda_event_sources.SqsEventSource(sqs, {
batchSize: 5,
})
const userSimulationlambda = Function.fromFunctionAttributes(
this,
'userssimulationlambda',
{
functionArn: userSimulationLambdaArn,
role: new cdk.aws_iam.Role(this, 'role1', {
assumedBy: new cdk.aws_iam.ServicePrincipal('sqs.amazonaws.com'),
}),
}
)
const marketMessageProcessorLambda = Function.fromFunctionAttributes(
this,
'marketmessageprocessor',
{ functionArn: marketMessageProcessorArn, sameEnvironment: true }
)
userSimulationlambda.env['SQS_URL'] = sqs.queueUrl
我这里基本上有 2 个 lambda。
一个名为 usersimulation
的 lambda 将消息发送到 SQS 队列,然后 marketmessageprocessor
lambda 处理这些消息。
这里的问题是:
我如何实际从 lambda usersimulation
发送消息?
我尝试将 QueueUrl 作为环境变量传递,但这不起作用。
我已经尝试过:
await sqs
.sendMessageBatch({
Entries: xmls.map((x, i) => ({
Id: `id_${i}_${Date.now()}`,
MessageBody: JSON.stringify(x),
})),
QueueUrl: process.env['SQS_URL']!,
})
.promise()
它未定义,它说:
MissingRequiredParameter: Missing required key 'QueueUrl' in params
将消息从 lambda 发送到 sqs 队列的最佳方式是什么?
我在这里使用 aws amplify,这两个函数都是使用 amplify function add
创建的
最佳答案
看起来 lambda 代码是正确的,但我怀疑 SQS_URL 环境变量未定义。您可以登录它来验证。
尝试对您的 CDK 代码进行此更改:
userSimulationlambda.addEnvironment('SQS_URL', sqs.queueUrl);
编辑
好的,我是 CDK 新手。看起来您在 userssimulationlambda
中有一个额外的 s。如果不是错误,那么它与您使用该术语的其他地方不一致。我仍然怀疑 lambda 中的 ENV var 未定义。记录它(在 lambda 中)以确定确定。如果您获得了对 lambda 的“引用”(通过 Function.fromFunctionAttributes ),您可以像您正在做的那样设置其环境变量,还是需要在函数实际所在的位置执行此操作创建了吗?
编辑2
另外,我认为 env
描述的是 Lambda 的环境(帐户、区域),而不是 environment
变量。我认为您需要获取一个 Function
并在其上调用 addEnvironment
或在创建 Lambda 函数时将 SQS url 作为键值属性包含在内。
关于aws-lambda - 如何使用 cdk 将 sqs 队列 URL 传递给 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75567834/