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)
这里有两个问题:
主题ARN(写入主题需要此主题)被硬编码。如何在我的代码中“动态”获得它?它是由无服务器框架以某种方式提供的吗?
即使主题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)
| 归档时间: |
|
| 查看次数: |
2225 次 |
| 最近记录: |