aws-lambda - 如何使用 cdk 将 sqs 队列 URL 传递给 lambda

标签 aws-lambda aws-cloudformation aws-amplify amazon-sqs aws-cdk

   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/

相关文章:

aws-lambda - 在 Cloudformation 之前或之后立即运行 Lambda 函数? AWS

amazon-rds - AWS Lambda 访问 RDS 的安全组

python - Boto3 更新多个值

amazon-web-services - 如何配置automate_aws_accounts_creation_sso_users_assignment.yaml以在我选择的区域中运行?

aws-lambda - AWS Lambda : How To Upload & Test Code Using Python And Command Line

amazon-web-services - 是否可以使用 CFT 将NotificationConfiguration 添加到现有的S3 存储桶?

amazon-web-services - AWS云信息错误: Deploy error with ImageID

amazon-web-services - 如何在 appsync 和 amplify 项目中使用 schema.graphql 而不是 schema.json?

node.js - AWS Amplify 教程无法启动客户端应用程序

graphql - 如何使用 Appsync 在 Cognito 中授予对某些用户组的访问权限