AWS Lambda自定义触发器

AWS Lambda自定义触发器

问题描述:

有人能告诉我如何访问AWS Lambda函数中的AWS凭证吗?AWS Lambda自定义触发器

我已经在互联网上彻底搜索过,但还没有找到任何帮助过我的东西。

我用Java编写函数。我想我应该可以使用HandleRequest方法中的上下文对象访问凭据。

如果有帮助,我想调用DynamoDB客户端并将记录上载到数据库。

+0

为什么不直接尝试不查找任何凭据?你已经在AWS上运行了,因此它应该推断你用来连接lambda的那个,所以它应该可以工作 – gerosalesc

+0

你的意思就是调用。 DynamoDbClient client = new dynamoDbClient();然后是正常的东西。真的,这很容易吗?你能证实这一点吗? –

+0

据我现在应该工作,但还没有尝试过,在过去 – gerosalesc

我最近自己也遇到了同样的问题。 在我看来,这当然是AWS的Lambda文档中的一个盲点。

这段代码在Java中应该为你工作,假设你正在使用AWS SDK的Java文档API:

DynamoDB dynamodb = new DynamoDB(
    new AmazonDynamoDBClient(new EnvironmentVariableCredentialsProvider())); 

主要外卖是使用EnvironmentVariableCredentialsProvider访问所需的凭据来访问你的其他AWS Lambda容器内的AWS资源。 Lambda容器随环境变量一起提供证书,这足以检索它们。

注意:这将创建一个只能看到默认区域中的资源的DynamoDB实例。要创建一个特定的区域,用这个(假设你要访问DynamoDB的在AP-东北1区):

DynamoDB dynamodb = new DynamoDB(
    Regions.getRegion(Regions.AP_NORTHEAST_1).createClient(
     AmazonDynamoDBClient.class, 
     new EnvironmentVariableCredentialsProvider(), 
     new ClientConfiguration())); 
+0

是。就是这样。谢啦! –

您的Lambda函数的权限由其执行的IAM角色控制。将Dynamo PutItem权限添加到当前角色,或为此创建新角色。

enter image description here

给予权限角色后,你不需要编写特殊的代码来处理凭证,只需使用AWS SDK正常。例如:

var AWS = require("aws-sdk"); 

exports.handler = function(event, context) { 
    var dynamodb = new AWS.DynamoDB(); 
    var putItemParams = { 
     "TableName": "Scratch", 
     "Item": { 
      "Id": { 
       "S": "foo" 
      }, 
      "Text": { 
       "S": "bar" 
      } 
     } 
    }; 
    dynamodb.putItem(putItemParams, function (err, response) { 
     if (err) { 
      context.fail("dynamodb.putItem failed: " + err); 
     } else { 
      context.succeed("dynamodb.putItem succeeded"); 
     } 
    }); 
}; 

足以将项目放入具有正确角色权限的DynamoDB表中。

+1

我建议使用https://github.com/awslabs/dynamodb-document-js-sdk而不是'DynamoDB'连接的'aws-sdk'。 – kixorz

添加到@Gordon泰的回答,用当前API使用AmazonDynamoDBClientBuilder这看起来像:

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() 
    .withCredentials(new EnvironmentVariableCredentialsProvider()) 
    .withRegion(Regions.US_EAST_1) 
    .build(); 
DynamoDB dynamoDB = new DynamoDB(client);