我无法使用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);
}
}
}
到控制台主页
添加amazondynamodreadonlyaccess、awslambdainioval DynamoDB
到控制台主页
到控制台主页
BasicAWSCredentials b = new BasicAWSCredentials("Access Key ID","Secret Access Key");
AmazonDynamoDBClient client = new AmazonDynamoDBClient(b);
您还需要正确指定资源:作为"*"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
您正在传递给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