1

是否可以在没有 API 网关的情况下使用 AWS SAM 在 Lambda 函数前面启动基础设施,例如 SQS 队列?

我只看到选项sam local invoke "Lambda" -e event.jsonsam local start-api

当我运行试图从消息队列中读取消息的 lambda 时,它没有找到如下引用的消息队列 URL:

NotificationFunction:
    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:
        Handler: index.handler
        Runtime: nodejs8.10
        Role: !Sub ${ConsumerLambdaRole.Arn}
        Timeout: 10

        Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object
            Variables:
                NODE_ENV: 'dev'
                MANDRILL_API_KEY: 'PUyIU3DAxJzIlt7KbBE5ow'
                SQS_URL: !Ref MessageQueue


MessageQueue: 
    Type: AWS::SQS::Queue
    Properties: 
        VisibilityTimeout: 60
        RedrivePolicy: 
        deadLetterTargetArn: !Sub ${DeadLetterQueue.Arn}
        maxReceiveCount: 10

# this is where any failed messages will go to
DeadLetterQueue: 
    Type: AWS::SQS::Queue
4

1 回答 1

0

正如评论所暗示的,sam local invoke 只会调用模板中您的 lambda 资源引用的代码 - 它本身不会创建任何资源。

不过,您可以做的是启动您的模板并使用 CLI 或通过 sam local invoke 调用 lambda 函数(尽管您需要执行 STS 角色假设以获得本地调用函数的正确角色)。但是,我假设您尝试做的是本地测试。在这种情况下,您可以执行以下操作:

  1. 下载本地堆栈 [1]
  2. 使用本地堆栈运行 SQS 服务的本地实例
  3. 配置您的函数以使用本地堆栈端点(其中有一些很好的示例可用 [2][3])

就我个人而言,我更喜欢避免本地测试,并且倾向于启动模板并通过假定的凭据在本地调用以进行调试。我倾向于拥有一个集成测试套件,我将针对沙盒 AWS 环境执行测试以进行测试。也就是说,设置它需要相当多的努力。

[1] https://github.com/localstack/localstack

[2] https://github.com/billthelizard/aws-sam-localstack-example

[3] http://www.piotrnowicki.com/python/aws/2018/11/16/aws-local-lambda-invocation/

于 2020-01-08T00:40:12.017 回答