我正在尝试使用入门( Java中的AWS Lambda代码编写)页面中的Java代码示例,但我被困为com.amazonaws.services.lambda.runtime pacakge似乎缺失了
以下是示例代码:
package example;
import com.amazonaws.services.lambda.runtime.Context; //package does not exist error
import com.amazonaws.services.lambda.runtime.LambdaLogger; // package does not exist error
import com.amazonaws.services.s3.AmazonS3; // import works (not needed, I've put them in for testing import)
import com.amazonaws.services.s3.model.S3Object; // import works (not needed, I've put them in for testing import)
public class Hello {
public String myHandler(int myCount, Context context) {
LambdaLogger logger = context.getLogger();
logger.log("received : " + myCount);
return String.valueOf(myCount);
}
}
Run Code Online (Sandbox Code Playgroud)
我在Netbeans中通过命令行(指定aws …
从API文档中,dynamo db确实支持扫描和查询操作的分页.这里的问题是将ExclusiveStartIndex当前请求设置LastEvaluatedIndex为先前请求的值,以获得结果的下一组(逻辑页).
我正在尝试实现相同但我正在使用DynamoDBMapper,这似乎有更多的优点,如与数据模型紧密耦合.所以,如果我想做上述事情,我假设我会做以下事情:
// Mapping of hashkey of the last item in previous query operation
Map<String, AttributeValue> lastHashKey = ..
DynamoDBQueryExpression expression = new DynamoDBQueryExpression();
...
expression.setExclusiveStartKey();
List<Table> nextPageResults = mapper.query(Table.class, expression);
Run Code Online (Sandbox Code Playgroud)
我希望我的上述理解在使用DynamoDBMapper进行分页时是正确的.其次,我怎么知道我已经到了结果的末尾.如果我使用以下api,请从文档中获取:
QueryResult result = dynamoDBClient.query((QueryRequest) request);
boolean isEndOfResults = StringUtils.isEmpty(result.getLastEvaluatedKey());
Run Code Online (Sandbox Code Playgroud)
回到使用DynamoDBMapper,我怎么知道在这种情况下我是否达到了结果的结尾.
我正在使用 AWS Congito 用户池通过 Cognito 身份池进行账户管理,该身份池将此用户池作为身份提供者。我使用它来控制通过 API 网关对 API 的访问,该网关将请求发送到 Lambda。我的 Lambda 是使用 Micronaut 用 Java 8 实现的。所有这些都运行良好。
在 Lambda 中,我从以下Principal中获取名称HttpRequest:
protected String resolveUser( HttpRequest request ){
String ret = null;
Optional<Principal> principal = request.getUserPrincipal();
if( principal.isPresent() ){
ret = principal.get().getName();
}
if( ret == null || ret.length() == 0 ){
ret = "unknown";
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
Cognito identityId 的字符串名称中返回的内容。像这样的东西:
us-east-1:xxxxe650-53f4-4cba-b553-5dff42bexxxx
我想记录实际的用户登录信息,或者至少有一些方法可以在需要时将 identityId 转换为登录信息。
该LookupDeveloperIdentity API调用似乎是去了解这个正确的方式,但我无法得到它的工作。
尝试使用 Java 和 AWS Java SDK 2 执行此操作: …
amazon-web-services amazon-cognito aws-java-sdk micronaut micronaut-aws
这是我得到的警告:
S3AbortableInputStream:并非所有字节都从S3ObjectInputStream中读取,从而中止HTTP连接.这可能是错误,可能导致次优行为.通过范围GET仅请求您需要的字节或在使用后消耗输入流.
我尝试使用try with resources但是S3ObjectInputStream似乎没有通过此方法关闭.
try (S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
){
//some code here blah blah blah
}
Run Code Online (Sandbox Code Playgroud)
我也试过下面的代码并明确关闭,但这也不起作用:
S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
){
//some code here blah blah
s3ObjectInputStream.close();
s3object.close();
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
PS:我只从S3读取两行文件,文件中有更多数据.
我需要弄清楚AWS SDK Java API和Jets3t API之间的关系?哪个在吞吐量和性能方面更好?
我假设连接不可靠,所以我可能需要上传/下载数据块.
JetS3t中有用于分段上传的API.但我也在寻找多部分下载.
我最近不得不升级到aws-java-sdk 1.11.108.我有一个java程序,它将s3对象(大小为8到10 GB)下载到EC2框并将其作为流处理.这个程序已经工作了2年多没有任何问题,但在更新到aws-java-sdk的最新版本后,我的文件下载在日志中中止了以下WARN消息(无例外)
WARN:com.amazonaws.services.s3.internal.S3AbortableInputStream - Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. Request only the bytes you need via a ranged GET or drain the input stream after use.
S3Object s3Obj = s3client.getObject(new GetObjectRequest(bucketName, s3FileName));
Reader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(s3Obj.getObjectContent());
Run Code Online (Sandbox Code Playgroud)
如果有人可以告诉为什么流静默地中止而不抛出任何异常,我会很感激,以及使它工作的最佳方法是什么.
谢谢
http://docs.aws.amazon.com/general/latest/gr/api-retries.html
本文档提到"每个AWS SDK实现自动重试逻辑,AWS SDK for Java自动重试请求".
如果我没有指定任何重试配置,那么Java AWS SDK的默认机制是什么?如果AWS服务端出现故障,我一直在使用Java AWS SDK并获得简单的服务异常.我从未经历过任何"自动"重试机制.有人可以解释一下这种重试机制是什么吗?
我正在尝试用 java 编写一个连接到 S3 的 Lambda 函数,然后获取数据。
当我在本地运行它时,使用 main 函数它工作正常并返回结果。但是当我将其上传到 AWS lambda 并运行它时,我收到以下错误消息:
"errorMessage": "无法执行 HTTP 请求:连接到存储桶名称.s3.amazonaws.com:443 [存储桶名称.s3.amazonaws.com/52.217.1.172] 失败:连接超时", "errorType": “com.amazonaws.SdkClientException”,
我的 S3 存储桶是公开的。
我的 pom.xml:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.493</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我的请求处理程序:
public class LambdaRequestHandler implements RequestHandler<String, String> {
@Autowired
public ClaimSuffixNumberService csService;
@Override
public String handleRequest(String input, Context context) {
if(csService == null) {
csService = Application.getBean(ClaimSuffixNumberService.class);
}
String result= csService.readAndMakeCall("claimSuffix");
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务
public String getObject(String fileName) …Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-web-services aws-sdk aws-lambda aws-java-sdk
我正在尝试从Lambda函数调用向SNS发布一些数据,但它似乎不起作用.我的功能代码是 -
public class Handler implements RequestHandler<DynamodbEvent, Void> {
private static final String SNS_TOPIC_ARN = "arn:aws:sns:us-west-2:account_number:function_name";
@Override
public Void handleRequest(DynamodbEvent dynamodbEvent, Context context) {
LambdaLogger logger = context.getLogger();
AmazonSNSClient snsClient = new AmazonSNSClient(new DefaultAWSCredentialsProviderChain());
snsClient.setRegion(Region.getRegion(Regions.US_WEST_2));
for (DynamodbStreamRecord record : dynamodbEvent.getRecords()) {
Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage();
if (newImage == null) {
continue;
}
String sensorId = newImage.get("sensorID").getS();
long timestamp = Long.parseLong(newImage.get("timestamp").getS());
double temperature = Double.parseDouble(newImage.get("payload").getM().get("temp").getN());
String data = sensorId + " " + timestamp + " " + temperature;
logger.log(data); …Run Code Online (Sandbox Code Playgroud) 今天我一直在和它斗争几个小时.我开始使用http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sending_mails上的文档,这些文档并没有真正说明具体步骤.它只是说开发人员可以包含Bean XML然后自动装配MailSender.我已尝试过以及许多变种,并且无法使用spring-cloud-aws使其工作.我最终直接使用了aws-java-sdk-ses并手动配置了这个类.
这是一个简单的项目,展示了我的尝试:https: //github.com/deinspanjer/aws-ses-test
这个项目编译,但当我运行它时,我得到:
Parameter 0 of constructor in com.example.awssestest.AwsSesTestApplication required a bean of type 'org.springframework.mail.MailSender' that could not be found.
- Bean method 'mailSender' not loaded because @ConditionalOnClass did not find required class 'javax.mail.internet.MimeMessage'
- Bean method 'simpleMailSender' not loaded because @ConditionalOnClass did not find required class 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService'
- Bean method 'javaMailSender' not loaded because @ConditionalOnClass did not find required class 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService'
Run Code Online (Sandbox Code Playgroud)
如果我尝试添加javax-mail(https://github.com/deinspanjer/aws-ses-test/tree/try-with-javax-mail-api),则错误将更改为:
Parameter 0 of constructor in com.example.awssestest.AwsSesTestApplication required …Run Code Online (Sandbox Code Playgroud) aws-java-sdk ×10
java ×4
amazon-s3 ×3
aws-lambda ×3
aws-sdk ×3
amazon-ec2 ×1
amazon-ses ×1
amazon-sns ×1
jets3t ×1
micronaut ×1
pagination ×1
spring-boot ×1