【问题标题】:aws-cdk add SQS eventSource to existing Lambdaaws-cdk 将 SQS 事件源添加到现有 Lambda
【发布时间】:2022-01-12 05:19:12
【问题描述】:

我正在创建多个 SQS 队列,并且我想在创建队列后添加一个 Lambda 触发器。执行 cdk 合成器命令时出现错误(见下文)。

我使用的是 1.130 版本的 aws-cdk 并且软件包都是相同的版本 (1.130.0)

构建类型错误时出错:无法读取未定义的属性“范围”

查看堆栈跟踪错误,它在 lambdaFunction.addEventSource 部分失败。

我正在关注 CDK 文档 (https://docs.aws.amazon.com/cdk/api/v1/docs/aws-lambda-event-sources-readme.html),基于此,我认为我正在遵循正确的步骤。

下面是我正在使用的代码:

const cdk = require(`@aws-cdk/core`);
const sqs = require(`@aws-cdk/aws-sqs`);
const { SqsEventSource } = require(`@aws-cdk/aws-lambda-event-sources`);
const lambda = require(`@aws-cdk/aws-lambda`);
const fs = require(`fs`);
const { env } = require(`process`);


class PVInfraSQSTopic extends cdk.Construct {
   constructor(scope, id, props) {
      super(scope, id, props);

      const buildEnvironment = JSON.parse(fs.readFileSync(`./config/`+JSON.parse(env.CDK_CONTEXT_JSON).config+`.json`, `utf8`));
      const sqsDLQ = buildEnvironment.sqsDeadLetterQueue;
      const lambdas = buildEnvironment.sqsLambdaTrigger;
      const sqsQueues = buildEnvironment.sqsQueues;
      const alias = buildEnvironment.alias;
      const region = buildEnvironment.region;
      const awsAccount = buildEnvironment.awsAccount;
      const queueName = `sqs-queue`;

      // Create Dead Letter Queue.
      const dlq = new sqs.Queue(this, `SQSBuild`, {
         queueName: sqsDLQ
      });
      // Create queues and configure dead letter queue for said queues.
      sqsQueues.map((item) => {
         new sqs.Queue(this, `queue-${item}`, {
            queueName: `${item}`,
            deadLetterQueue: {
               maxReceiveCount: 3,
               queue: dlq
            }
         });
      });

      // Add SqsEventSource (Lambda Triggers) to new SQS queues
      const lambdaFunction = lambda.Function.fromFunctionAttributes(this, `function`, {
         functionArn: `arn:aws:lambda:${region}:${awsAccount}:function:${lambdas}:${alias}`
      });


      lambdaFunction.addEventSource(new SqsEventSource(queueName, {
         batchSize: 10
      }));
   }
}

module.exports = { PVInfraSQSTopic };

lambda 已经存在,所以我不创建它作为这个堆栈的一部分。

【问题讨论】:

    标签: aws-cdk


    【解决方案1】:

    您的第一个问题是,当需要 IQueue 时,您将 SqsEventSource 构造函数传递给 string (queueName)。

    它仍然不会合成,通过。您还需要向 CDK 提供有关您现有 lambda 的更多信息,即 lambda 的 IAM 角色。

    这是一个最小的工作示例。我正在导入在现有 Lambda 堆栈中导出为 StackOutputs 的现有 lambda 资源 ARN,但这是一个实现细节。

    export class SqsExistingEventSourceStack extends cdk.Stack {
      constructor(scope: Construct, id: string, props: cdk.StackProps) {
        super(scope, id, props);
    
        const q = new sqs.Queue(this, 'MyQueue');
    
        const lambdaFunction = lambda.Function.fromFunctionAttributes(this, `function`, {
          functionArn: cdk.Fn.importValue('MinimalLambdaArn'),
          role: iam.Role.fromRoleArn(this, 'importedRole', cdk.Fn.importValue('MinimalLambdaRoleArn')),
        });
    
        lambdaFunction.addEventSource(new sources.SqsEventSource(q, {batchSize: 10,}) );
      }
    }
    

    OP 没有显示您如何将 PVInfraSQSTopic 构造添加到堆栈中,这也可能是“范围”错误的来源。

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2016-09-30
      • 2021-11-06
      • 1970-01-01
      • 2021-10-04
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多