我在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()
// ...
这里有两个问题:
主题ARN(写入主题需要)是硬编码的。我如何“动态地”在我的代码中得到这个?它是通过无服务器框架以某种方式提供的吗?
即使主题arn是硬编码的,lambda函数也没有写入该主题的权限。我如何在serverless.yml文件中定义这样的权限?
答案 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()
// ...