当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda尝试列出DynamoDb表时出错

龚玄天
2023-03-14

我无法使用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:幸福ace.jpgAWS凭据配置文件未在给定路径中找到: /home/sbx_user1052/.aws/credentials:java.lang.IllegalArgumentExcturejava.lang.IllegalArgumentExcture: AWS在给定路径中找不到凭据配置文件: /home/sbx_user1052/.aws/credentialscom.amazonaws.auth.profile.internal.ProfilesConfigFileLoader.loadProfile(ProfilesConfigFileLoader.java:45)com.amazonaws.auth.profile.ProfilesConfigFile.loadProfile(ProfilesConfigFile.java:176)在com.amazonaws.auth.profile.配置文件。ProfilesConfigFile.java:112)在com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:92)在com.amazonaws.auth.profile.ProfileCreentalsProvider.get凭据(ProfileCreentalsProvider.java:123)在com.amazonaws.services.dynamodbv2。在com.amazonaws.services.dynamodbv2lient.invoke(Amazon DynamoDBClient.java:1763)。Amazon DynamoDBClient. listTables(Amazon DynamoDBClient. java: 1208)在com. amazonaws. service. Dynamodbv2. file. interal。ListTablesCollse. firstPage(ListTablesCollse. java: 46)在com. amazonaws. service. Dynamodbv2. file. interal。PageIterator. Next(PageIterator. java: 45)在com. amazonaws. service. Dynamodbv2. file. interal。IteratorSupport. nextResources(IteratorSupport. java: 79)在com. amazonaws. service. Dynamodbv2.文件。IteratorSupport. hasNext(IteratorSupport. java: 47)at com.TriggerDynamoDB. handleRequest(TriggerDynamoDB. java: 68)at sun.反射。nativemethod odAccessorImp. invke0(本机方法)在sun.反射。NativeMEDAccessorInp. invoke(NativeMEDAccessorInp. java: 62)在sun. reff。在java. lang.反射中调用(委托方法访问或执行. java: 43)。方法调用

结束请求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);
     }
}
}

共有3个答案

穆招
2023-03-14

到控制台主页

添加amazondynamodreadonlyaccess、awslambdainioval DynamoDB

到控制台主页

到控制台主页

BasicAWSCredentials b = new BasicAWSCredentials("Access Key ID","Secret Access Key");           
AmazonDynamoDBClient client = new AmazonDynamoDBClient(b);
戚阳
2023-03-14


您还需要正确指定资源:作为"*"not"

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

{"版本":"2012-10-17","语句": [ { "Sid":"Stmt1428341300017","Action":["Dynamodb: DeleteItem","Dynamodb: GetItem","Dynamodb: PutItem","Dynamodb: Query","Dynamodb: Scan","Dynamodb: UpdateItem","Dynamodb: ListTables"],"效果":"允许","资源"": "" }, { "Sid": "", "资源": "", "操作":["日志: CreateLogGroup","日志: CreateLogStream","日志: PutLogEvents"],"效果":"允许" } ] }

此外,为了将来参考,请通读/尝试以下内容:http://docs.aws.amazon.com/IAM/latest/UserGuide/policies_testing-policies.html

许琛
2023-03-14

您正在传递给Amazon onDynamoDBClient构造函数的ProfileCreentalsProvider试图从~/. aws/凭据文件加载凭据。此文件在运行Lambda函数的主机上不存在,因此出现异常。此提供程序主要用于集成测试,这些测试在您的开发机器上运行,并使用您的个人IAM用户凭据。

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

如果为AmazondynamodClient使用无参数构造函数,则默认情况下将使用DefaultAWSCredentialsProviderChain来提取凭据。此提供程序检查环境变量、Java系统属性。aws/credentials和EC2实例元数据服务(按此顺序),并且无论您是在本地运行还是在Lambda上运行,都应该获取凭据。

 类似资料:
  • 我有以下代码,其中列出了在我的网络上找到的域。 这给我带来了麻烦 jcifs。中小企业。SmbAuthException:登录失败、用户名未知或密码错误。 问题是,我知道代码应该可以工作,因为有时(比如15次运行中的1次),它会列出它应该列出的域: 域1/域2/域3/ 也尝试了我的家庭网络上的代码,它每次都能工作。 无论如何,如果我尝试列出特定域的文件: raiz=新的SMB文件(“smb://D

  • 我试图从XML类型列中检索某个节点。 我的代码在本地环境中的Tomcat中运行良好,但当我创建EAR文件并将其部署到WeSphere Application Server中时。我得到一个错误: 引起:java.lang.NoClassDefFoundError:oracle.xdb.XMLType 在oracle.jdbc.driver.NamedTypeAccessor.getOracleObj

  • 我正在尝试使用java。util。Eclipse中Java项目中的ArrayList。它在这个IDE上解决起来很有趣,与我在NetBeans上的习惯相反。例如: 在NetBeans上,我可以简单地创建一个通用数组列表,如下所示: 但是,在Eclipse上,如果要成功声明和初始化ArrayList,结构如下: 我被迫做一个类型转换,而泛化只能在右侧完成。 然而,这还不算太糟糕,直到我尝试调用一些Ar

  • 问题内容: 尝试添加另一个列表时抛出List.addAll 。 在循环中,我在做, 从文件中读取 supportType 。 但是第2行抛出一个,但是我无法确定为什么? 我要在列表中添加另一个列表,那么为什么不支持此操作? 问题答案: 返回一个固定大小的列表,该列表由数组支持,并且您不能向其中添加元素。 您可以创建一个可修改的列表以进行工作:

  • 我试图上传一个图像到内存使用multer,然后处理它与夏普和保存到磁盘。当我尝试在我的中间件中做多个module.exports时。 错误是: TypeError FileUpload.Single不是函数 到目前为止的路线是: 当我刚刚有下面的路由之前,尝试添加图像处理,我没有得到一个错误;

  • 我正在使用Java8开发Spring Boot Version2,当我试图在“createTopic”方法中将一个新的列表对象添加到预定义的列表对象(即topicList)中时,我得到了一个错误。 ** TopicService.java ** ** 2020-04-15 19:52:27.172错误15312---[nio-8080-exec-2]O.A.C.C.C.[.[.[/].[dispa