如何将Amplify应用程序ID传递给函数?如何从后端函数进行应用程序内省?

0

【以下的问题经过翻译处理】 背景

使用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 中所述。显然没有解决方案。

profile picture
专家
已提问 5 个月前19 查看次数
1 回答
0

【以下的回答经过翻译处理】 我认为应用程序ID应默认可用于函数。如果不是,则应该比我经历的简单。至少应该有文档说明。关于环境变量的文档似乎是不正确的。或者可能我误解了,但仍然似乎存在问题。

从构建时传递变量到runtime

总体技术是将AWS_APP_ID环境变量从构建环境传递到Lambda运行时环境,在那里它将提供给 Lambda 函数。

AWS_APP_ID在构建时可用

Amplify文档的此页面列出了一组应在构建时可用的环境变量。事实并非如此。该列表中唯一可在构建时使用的变量是AWS_APP_ID。尽管如此,这已经足够了。

将AWS_APP_ID插入到CloudFormation模板中

我在我的函数的CloudFormation模板中引用了该变量,如下所示:

        "Environment": {
          "Variables": {
            "AWS_APP_ID": "{{AWS_APP_ID}}",

然后我设置我的构建使用现成的NPM将变量插入其中。{{}}语法来自该NPM。可能有一种方式可以使用sed或类似的工具来使构建过程更快,并且不依赖于该NPM。

Lambda函数中正常访问环境变量

然后,您可以按照函数运行时的通常方式访问Lambda函数中的应用程序ID:

const app_id = process.env.AWS_APP_ID
console.log(`app_id: ${app_id}`)

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则