如何在lambda处理程序中获取SNS主题ARN并设置对它的权限?

时间:2018-01-30 13:30:01

标签: 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

将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()
      // ...

这里有两个问题:

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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()
  // ...