【以下的问题经过翻译处理】 背景
使用amplify add function
,通过 Lambda 函数可轻松扩展 Amplify 应用程序
问题
如何从 Lambda 函数代码中访问 Amplify 应用程序 ID?有很多场景需要使用该字符串才能定位资源或访问 SSM 中的密码。
更一般地说
我的函数如何对应用进行自省?我如何从 Lambda 函数中获取应用 ID?有服务吗?我应该通过 CloudFormation 模板将信息(以某种方式)传递给函数吗?
调查
我花了好几天的时间来弄明白这个问题,至少我已经掌握了一种秘密的、未记录的方法,可以将嵌套的 CloudFormation 栈的输出中的任何内容转换成我的 CloudFormation 栈的参数,这样我就可以创建我的 Lambda 函数可以看到的环境变量。
这并不能解决我寻找顶级应用程序 ID 的根本问题。或任何关于顶级应用程序的信息。
如何将应用资源的堆栈输出传递到函数堆栈参数
我花了几天时间试图弄清楚这个问题,并且至少我已经学会了使用 backend-config.json 中的 dependsOn
来获取 Amplify 应用中其他资源的 CloudFormation 堆栈的输出,并将这些输出放入我的函数堆栈的参数中:
"function": {
"MyFunctionName": {
"build": true,
"providerPlugin": "awscloudformation",
"service": "Lambda",
"dependsOn": [
{
"category": "api",
"resourceName": "Data",
"attributes": [
"GraphQLAPIIdOutput"
]
}
],
}
}
}
这将为您的函数创建一个新参数,该参数使用一种模式命名,据我所知,这种模式在任何地方都没有记录:[category][resource name][CloudFormation stack output name]
。您可以在 CloudFormation 堆栈中引用该参数,为您的函数创建一个环境变量,供您的函数代码访问:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
...
"secretsPathAmplifyAppId": {
"Type": "String"
}
...
"Resources": {
...
"Environment": {
"Variables": {
"AMPLIFY_APP_ID": {
"Ref": "secretsPathAmplifyAppId"
},
在amplify-meta.json
中使用AmplifyAppId
并不起作用
如果我可以从 dependsOn
访问provider/cloudformation
数据,那么我就可以得到app ID并放入函数堆栈中。但是这并不可行。
使用secretsPathAmplifyAppId
使用amplify更新函数添加secrets有一个副作用。如果您在函数中添加任何secret,您将获得一个新参数作为函数 CloudFormation 堆栈的输入:secretsPathAmplifyAppId
我这样做了,并添加了一个我并不真正需要的secret,以便获得包含我需要的 Amplify 应用程序 ID 的 CloudFormation 堆栈参数。然后,我在 CloudFormation 模板中为我的函数引用了该参数:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
...
"env": {
"Type": "String"
},
"s3Key": {
"Type": "String"
},
...
"secretsPathAmplifyAppId": {
"Type": "String"
}
但是这并不起作用
如果我在 Amplify 中创建一个新应用程序,也许是第一次将它部署到staging账户或生产账户,那么我就会在从“Host your web app"表单点击“Save and Deploy”后收到错误信息 Parameters: [secretsPathAmplifyAppId] must have values。 这是由于secretsPathAmplifyAppId 依赖于 Amplify CLI 将值添加到 team-provider-info.json 文件。对于新应用程序的首次部署,"管理用户界面部署任务中没有 team-provider-info.json 文件",如 https://github.com/aws-amplify/amplify-cli/issues/8513 中所述。显然没有解决方案。