如何在Lambda处理程序中获取SNS主题ARN并设置访问权限?

use*_*521 5 serverless-framework

我在serverless.yml中定义了两个lambda函数:graphql和convertTextToSpeech。前者(在GraphQL端点之一中)应写入SNS主题以执行后者。这是我的serverless.yml文件:

service: hello-world

provider:
  name: aws
  runtime: nodejs6.10

plugins:
  - serverless-offline

functions:
  graphql:
    handler: dist/app.handler
    events:
      - http:
          path: graphql
          method: post
          cors: true
  convertTextToSpeach:
    handler: dist/tasks/convertTextToSpeach.handler
    events:
      - sns:
          topicName: convertTextToSpeach
          displayName: Convert text to speach
Run Code Online (Sandbox Code Playgroud)

并将GraphQL端点写入SNS:

      // ... 
      const sns = new AWS.SNS()

      const params = {
        Message: 'Test',
        Subject: 'Test SNS from lambda',
        TopicArn: 'arn:aws:sns:us-east-1:101972216059:convertTextToSpeach'
      }
      await sns.publish(params).promise()
      // ...
Run Code Online (Sandbox Code Playgroud)

这里有两个问题:

  1. 主题ARN(写入主题需要此主题)被硬编码。如何在我的代码中“动态”获得它?它是由无服务器框架以某种方式提供的吗?

  2. 即使主题arn是硬编码的,lambda函数也没有权限写入该主题。如何在serverless.yml文件中定义此类权限?

jen*_*ter 11

1)您可以动态解决主题。

这可以通过CloudFormation内部函数来完成,该函数在无服务器模板中可用(请参阅添加的环境部分)。

functions:
  graphql:
    handler: handler.hello
    environment:
      topicARN:
        Ref: SNSTopicConvertTextToSpeach
    events:
      - http:
          path: graphql
          method: post
          cors: true
  convertTextToSpeach:
    handler: handler.hello
    events:
      - sns:
          topicName: convertTextToSpeach
          displayName: Convert text to speach
Run Code Online (Sandbox Code Playgroud)

在这种情况下,实际的主题引用名称(由无服务器框架生成)为SNSTopicConvertTextToSpeach。这些名称的生成在无服务器文档中进行了说明。

2)现在,该主题的ARN已映射到环境变量,您可以通过过程变量(process.env.topicARN)在GraphQL lambda中访问它。

  // ... 
  const sns = new AWS.SNS()

  const params = {
    Message: 'Test',
    Subject: 'Test SNS from lambda',
    TopicArn: process.env.topicARN
  }
  await sns.publish(params).promise()
  // ...
Run Code Online (Sandbox Code Playgroud)