Java AWS Lambda尝试列出DynamoDb表时出错

Java AWS Lambda尝试列出DynamoDb表时出错,java,amazon-web-services,amazon-s3,aws-lambda,Java,Amazon Web Services,Amazon S3,Aws Lambda,我无法使用Java在AWS Lambda上使用以下逻辑: 1) 当在S3 bucket中创建新对象时,触发lambda函数(用java编写) 2) 在这个lambda函数中,列出所有DynamoDB表 3) 如果没有,请创建一个表 4) 将S3对象的详细信息作为项写入DynamoDB 我只让第1项起作用。当它到达第2项时,我在下面遇到了一个与权限相关的错误 有什么帮助或建议吗 我使用的权限是“带DynamoDB的Basic”,它具有以下权限: 启动请求ID:e9ab5aba-307b-11e5

我无法使用Java在AWS Lambda上使用以下逻辑:

1) 当在S3 bucket中创建新对象时,触发lambda函数(用java编写)

2) 在这个lambda函数中,列出所有DynamoDB表

3) 如果没有,请创建一个表

4) 将S3对象的详细信息作为项写入DynamoDB

我只让第1项起作用。当它到达第2项时,我在下面遇到了一个与权限相关的错误

有什么帮助或建议吗

我使用的权限是“带DynamoDB的Basic”,它具有以下权限:

启动请求ID:e9ab5aba-307b-11e5-9663-3188c327cf5e 文件大小:1024,日期时间:1970-01-01T00:00:00.000Zs3Key:HappyFace.jpgAWS凭据配置文件未在给定路径中找到:/home/sbx_user1052/.aws/credentials:java.lang.IllegalArgumentException java.lang.IllegalArgumentException:在给定路径中找不到AWS凭据配置文件:/home/sbx_user1052/.AWS/credentials 在com.amazonaws.auth.profile.internal.ProfilesConfigFileLoader.loadProfiles(ProfilesConfigFileLoader.java:45) 在com.amazonaws.auth.profile.ProfilesConfigFile.loadProfiles(ProfilesConfigFile.java:176) 位于com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:112) 位于com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:92) 位于com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.java:123) 位于com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:1763) 位于com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.listTables(AmazonDynamoDBClient.java:1208) 位于com.amazonaws.services.dynamodbv2.document.internal.ListTablesCollection.firstPage(ListTablesCollection.java:46) 在com.amazonaws.services.dynamodbv2.document.internal.PageIterator.next(PageIterator.java:45)上 在com.amazonaws.services.dynamodbv2.document.internal.IteratorSupport.nextResource(IteratorSupport.java:79) 位于com.amazonaws.services.dynamodbv2.document.internal.IteratorSupport.hasNext(IteratorSupport.java:47) 位于com.triggerdynamiodb.handleRequest(triggerdynamiodb.java:68) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:497)

最终请求ID:e9ab5aba-307b-11e5-9663-3188c327cf5e 报告请求ID:e9ab5aba-307b-11e5-9663-3188c327cf5e持续时间:3294.97毫秒计费持续时间:3300毫秒内存大小:512 MB最大使用内存:51 MB

代码如下:

public class TriggerDynamoDB implements RequestHandler<S3Event, String> {

public String handleRequest(S3Event s3event, Context context) {
     LambdaLogger logger = context.getLogger();
     try {           
         S3EventNotificationRecord record = s3event.getRecords().get(0);
         // Object key may have spaces or unicode non-ASCII characters.
         String srcKey = record.getS3().getObject().getKey().replace('+', ' ');
            srcKey = URLDecoder.decode(srcKey, "UTF-8");

         long fileSize = record.getS3().getObject().getSizeAsLong();
         DateTime datetime = record.getEventTime(); 

         logger.log("fileSize: " + fileSize + ", DateTime:" + datetime);
         logger.log("s3Key   : " + srcKey);

         DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
         //Table table = dynamoDB.getTable("dimensionFile");

         TableCollection<ListTablesResult> tables = dynamoDB.listTables();
         Iterator<Table> iterator = tables.iterator();

         while (iterator.hasNext()) { // this is where the error was thrown
             Table table = iterator.next();
             System.out.println(table.getTableName());
         }                    
         return "Ok";
     } catch (Exception e) {
         throw new RuntimeException(e);
     }
}
}
公共类TriggerDynamoDB实现RequestHandler{
公共字符串handleRequest(S3Event S3Event,上下文){
LambdaLogger logger=context.getLogger();
试试{
S3EventNotificationRecord记录=s3event.getRecords().get(0);
//对象键可以有空格或unicode非ASCII字符。
字符串srcKey=record.getS3();
srcKey=urldecker.decode(srcKey,“UTF-8”);
long fileSize=record.getS3().getObject().getSizeAsLong();
DateTime DateTime=record.getEventTime();
log(“fileSize:+fileSize+”,DateTime:+DateTime);
logger.log(“s3Key:+srcKey”);
DynamoDB DynamoDB=新的DynamoDB(新的AmazondynamodClient(新的ProfileCredentialsProvider());
//Table=dynamoDB.getTable(“dimensionFile”);
TableCollection tables=dynamoDB.listTables();
迭代器迭代器=tables.Iterator();
while(iterator.hasNext()){//这是引发错误的地方
Table=iterator.next();
System.out.println(table.getTableName());
}                    
返回“Ok”;
}捕获(例外e){
抛出新的运行时异常(e);
}
}
}

您需要对操作具有dynamoDb listTables权限。
您还需要正确指定资源:为“*”而不是

以下是包含列表表的有效策略:

{“版本”:“2012-10-17”,“声明”:[{“Sid”: “Stmt1428341300017”,“操作”:[“dynamodb:DeleteItem”, “dynamodb:GetItem”、“dynamodb:PutItem”、“dynamodb:Query”, “dynamodb:扫描”、“dynamodb:更新项”、“dynamodb:列表表”], “效果”:“允许”,“资源”:“},{”Sid:““资源”:”, “操作”:[“日志:CreateLogGroup”,“日志:CreateLogStream”, “logs:PutLogEvents”],“Effect”:“Allow”}]}

此外,为了将来参考,请通读/尝试以下内容:

传递给AmazondynamodClient构造函数的尝试从
~/.aws/credentials
文件加载凭据。运行Lambda函数的主机上不存在此文件,因此出现异常。此提供程序主要用于在开发人员计算机上运行并使用个人IAM用户凭据的集成测试

在Lambda上,你想要。此提供程序将从Lambda在调用代码之前设置的环境变量中加载与Lambda函数关联的IAM角色的临时凭据


如果您为AmazonDynamoDBClient使用无参数构造函数,它将默认为使用to-pull凭据。此提供程序检查环境变量、Java系统属性、
~/.aws/credentials
和EC2实例元数据服务(按此顺序),并应获取您是在本地运行还是在Lambda上运行的凭据。

转到控制台主页>IAM>组>您的组>权限>附加策略

添加amazondynamodreadonlyaccess、awslambdainioval DynamoDB


转到控制台主页>IAM>组>您的组>用户>将用户添加到G
BasicAWSCredentials b = new BasicAWSCredentials("Access Key ID","Secret Access Key");           
AmazonDynamoDBClient client = new AmazonDynamoDBClient(b);
new AmazonDynamoDBClient(new ProfileCredentialsProvider())
AmazonDynamoDBClientBuilder.standard().build()