【问题标题】:How to access additional AWS resources from within an Amplify generated Lambda function?如何从 Amplify 生成的 Lambda 函数中访问其他 AWS 资源?
【发布时间】:2019-10-14 09:28:48
【问题描述】:

我一直在使用 AWS Amplify。作为 AWS 的新手,我非常喜欢 Amplify 如何为我在 AWS 上预置必要的资源和 IAM 角色。我的问题是关于使用 Lambda 和 GraphQL。按照文档,我能够创建一个自定义 GraphQL 查询,该查询调用一个 Lambda 函数并返回一个 GraphQL 响应。但是,我在文档中找不到有关如何在此 Lambda 函数中与 其他 AWS 资源进行交互的任何地方。例如,我希望与 DynamoDB 甚至 RDS 服务进行交互。文档提到能够从其他资源(例如 MySQL 数据库)中提取数据,所以我认为这是可能的。

当我尝试与 DynamoDB 交互(例如)时,我收到了“拒绝访问”错误,我假设这是因为 Lambda 函数没有必要的策略/权限来执行此操作。我的一个想法是手动登录到 IAM 控制台并自己附加这些策略,但鉴于 Amplify 会为您生成所有这些并基本上管理您的“云基础设施/状态”,我不确定这是否是正确的方法.我确实注意到了 Amplify 在您为 GraphQL 添加 Lambda 资源时生成的 Cloud Formation 模板,所以我的下一个猜测是在那里添加 DynamoDB 策略,然后运行 ​​amplify push 以让 Amplify 生成和管理策略我。如果这是正确的做法,我想我将不得不学习如何编写 Cloud Formation 模板。最后,我想知道我的大脑是否妨碍了我,我是否能够通过 Lambda 中的 AWS JavaScript SDK 传递 Cognito 身份信息,然后事情就会“正常工作”——但我并不完全确定。如果我没有使用正确的术语,我提前道歉 - 正如我所说,我对 AWS 比较陌生。非常感谢任何帮助或指导。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-sdk aws-amplify


    【解决方案1】:

    你是对的。您可以修改云形成脚本以添加 lambda 的权限。

    但请记住,默认情况下 lambda 不在 VPC 中,您可以与 RDS 交互,但不能与 VPC 中的 RDS 实例交互。将 lambda 放入与 RDS 实例相同的 VPC 后,您可以与实例通信,但不能与 RDS 服务通信,因为 lambda 无法访问 Internet。为此,您需要一个 VPC 终端节点或 Nat 网关。

    【讨论】:

      【解决方案2】:

      借助 2019 年 5 月 30 日发布的最新 aws-amplify,您可以

      ...轻松授予创建/读取/更新/删除权限,以便通过 Lambda 函数与 AWS 资源(例如 DynamoDB)进行交互。

      示例代码:

      /* Amplify Params - DO NOT EDIT
      You can access the following resource attributes as environment variables from your Lambda function
      var environment = process.env.ENV
      var region = process.env.REGION
      var storageTeststorageName = process.env.STORAGE_TESTSTORAGE_NAME
      var storageTeststorageArn = process.env.STORAGE_TESTSTORAGE_ARN
      
      Amplify Params - DO NOT EDIT */
      
      var AWS = require('aws-sdk');
      var region = process.env.REGION
      var storageTeststorageName = process.env.STORAGE_TESTSTORAGE_NAME
      AWS.config.update({region: region});
      var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
      var ddb_table_name = storageTeststorageName
      var ddb_primary_key = 'id';
      
      function write(params, context){
          ddb.putItem(params, function(err, data) {
          if (err) {
            console.log("Error", err);
          } else {
            console.log("Success", data);
          }
        });
      }
      
      
      exports.handler = function (event, context) { //eslint-disable-line
      
        var params = {
          TableName: ddb_table_name,
          Item: AWS.DynamoDB.Converter.input(event.arguments)
        };
      
        console.log('len: ' + Object.keys(event).length)
        if (Object.keys(event).length > 0) {
          write(params, context);
        } 
      }; 
      

      详情请阅读blog post

      【讨论】:

        猜你喜欢
        • 2020-12-19
        • 1970-01-01
        • 2018-06-25
        • 2023-04-03
        • 1970-01-01
        • 2020-05-11
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多