如何从Amplify生成的Lambda函数中访问其他AWS资源?

时间:2019-05-28 19:51:42

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

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

例如,当我尝试与DynamoDB进行交互时,我收到了“访问被拒绝”错误,我认为这是因为Lambda函数没有执行此操作所必需的策略/权限。我曾经想过要手动登录IAM控制台并自己附加这些策略,但是鉴于Amplify会为您生成所有这些内容并从根本上管理您的“云基础架构/状态”,所以我不确定这是否是正确的方法。我确实注意到,当您为GraphQL添加Lambda资源时,Amplify会生成云形成模板,因此,我的下一个猜测是在此处添加DynamoDB策略,然后运行 amplify push 以使Amplify生成并管理该模板的策略。我。如果这是正确的方法,我想我将必须学习如何编写“云形成”模板。最后,我想知道我的大脑是否会挡住路,是否能够通过Lambda内的AWS JavaScript SDK传递Cognito身份信息,然后事情就可以“奏效”了-但我不确定。如果我使用的术语不正确,请提前道歉-正如我所说,我对AWS来说还比较陌生。任何帮助或指示,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

有了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

答案 1 :(得分:0)

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

但是请记住,默认情况下,lambda不在VPC中,您可以与RDS交互,但不能与VPC中的RDS实例交互。一旦将Lambda与RDS实例放在同一VPC中,就可以与该实例通信,但不能与RDS服务通信,因为Lambda无法访问Internet。为此,您需要一个VPC端点或Nat Gateway。