标签: aws-sdk

DynamoDB:如何使用查询过滤器检查MAP中的条件

我有一个表,结构如下:

DynamoDB文档

当我进行查询时,我希望能够对数据映射进行查询过滤; 但我不确定如何设置查询.

这是我到目前为止:

HashMap<String, AttributeValue> map = new HashMap<String, AttributeValue>();
map.put("byUserId", new AttributeValue().withS("vl49uga5ljjcoln65rcaspmg8u"));

queryExpression
    .withQueryFilterEntry("data", new Condition()
        .withAttributeValueList(new AttributeValue().withM(map))
        .withComparisonOperator(ComparisonOperator.CONTAINS));
Run Code Online (Sandbox Code Playgroud)

但我构建过滤器的方式不正确,我一直遇到以下错误:

Exception in thread "main" com.amazonaws.AmazonServiceException: One or more parameter values were invalid: ComparisonOperator CONTAINS is not valid for M AttributeValue type (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: CHIOME68L1HVGO81URD7CIOS6BVV4KQNSO5AEMVJF66Q9ASUAAJG)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1077)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:725)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:460)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:295)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:3106)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.query(AmazonDynamoDBClient.java:1118)
Run Code Online (Sandbox Code Playgroud)

那么我应该使用什么比较运算符(因为IN用于列表类型),以及如何构建查询过滤器以便我可以在MAP内部指定比较.

谢谢!

java amazon-web-services amazon-dynamodb aws-sdk

12
推荐指数
1
解决办法
2万
查看次数

使用http端点访问lambda中的HTTP请求(标头,查询字符串,cookie,正文)对象

我试图看看如何从lambda代码中访问请求标头和正文值.如果请求主体是JSON格式,它似乎会自动解析并在事件对象中可用.

如何在Lambda中访问任何类型的传入"Content-Type"请求的完整查询字符串,请求正文,请求标头(cookie)?


以下编辑是我收集的信息,以帮助解决可能相关或不相关的问题.如果你愿意,请忽略它们.


编辑:

我在这里这里详细介绍了SE的现有问题.按照这个线程,使用$input.json('$')应该做的伎俩.我猜上面这些链接的答案已经过时,因为默认情况下API网关似乎在请求中识别JSON,如果是这样,它在event对象中可用,而不配置任何映射模板.

按建议设置映射对我不起作用.它不包含请求标头信息.

以下是有关如何配置的屏幕截图.

在此输入图像描述


在此输入图像描述

"headers"键返回一个空值.使用$input.params('$')"$input.params('$')"错误输出.


编辑2

尝试在方法请求中定义标头.仍然没有在lambda中获取User-Agent值.

在此输入图像描述


编辑3

我在API网关上使用了以下模板映射

{
    "request": $input.json('$'),
    "headers": "$input.params()"
}
Run Code Online (Sandbox Code Playgroud)

以及lambda中的以下代码

context.succeed("event.key32:"+JSON.stringify(event, null, 2) );
Run Code Online (Sandbox Code Playgroud)

API网关生成的响应显示了这一点 在此输入图像描述

查看响应中的"标题"值,看起来AWS-SDK/API网关/ cloudfront剥离了从HTTP客户端收到的所有标头?以下是$ input.params().标头返回的JSON的全文

header={CloudFront-Forwarded-Proto=https, CloudFront-Is-Desktop-Viewer=true, CloudFront-Is-Mobile-Viewer=false, CloudFront-Is-SmartTV-Viewer=false, CloudFront-Is-Tablet-Viewer=false, Content-Type=application/json, Via=1.1 5d53b9570d94ce920abbd471.cloudfront.net (CloudFront), 1.1 95eea7baa7ec95c9a41eca9e3ab7.cloudfront.net (CloudFront), X-Amz-Cf-Id=GBqmObLRy6Iem9bJbVPrrW1K3YoWRDyAaMpv-UkshfCsHAA==, X-Forwarded-For=172.35.96.199, 51.139.183.101, X-Forwarded-Port=443, X-Forwarded-Proto=https}}
Run Code Online (Sandbox Code Playgroud)

它在标头中没有User-Agent字符串,尽管如上面的屏幕截图所示,它是由REST客户端发送的.有趣的是,整个查询字符串可用.不确定这是否是访问它的预期方式.

amazon-web-services aws-sdk aws-lambda aws-api-gateway

12
推荐指数
1
解决办法
9945
查看次数

多个文件的预签名网址?

我已经编写了一个实现,用于为aws-s3上的存储桶生成预先签名的URL.它可以正常工作,用于获取单个文件/对象.

我如何为整个目录生成预先签名的URL?让我们这样说吧,在我的s3存储桶上,有多个文件夹都有自己的小html5应用程序.每个文件夹都有自己的一组html,css,js以及媒体文件.在这种情况下,我不会为单个对象生成预先签名的URL.

如果我为单个文件提供预先签名的URL,例如:文件夹的index.html,该文件也需要加载css,js和media文件.我们没有签名网址的文件.

我不太确定如何实施这个.

amazon-s3 amazon-web-services aws-sdk

12
推荐指数
3
解决办法
8627
查看次数

获取AWS SMS的交付状态

我正在通过节点SDK从AWS发送短信.短信很顺利,我正在尝试获取交付信息.显然它不是那么容易,需要设置SNS将日志发送到Cloudwatch并解析CloudWatch以获取查询MessageId的交付信息:https://stackoverflow.com/a/40327061/2054629

如果我通过SNS Web界面发送短信,日志我会看到cloudwatch中的日志,但是当我通过节点SDK发送它们时.在从节点发送之前,我无法获得有关如何设置内容的信息.

理想情况下,我希望实现以下目标:

const sendSMS = async (message, number) => {
    // send the SMS
    // wait to get delivery info
    // resolve with delivery info, or reject if failed
}
Run Code Online (Sandbox Code Playgroud)

目前我有:

import AWS from 'aws-sdk';

AWS.config.update({
  accessKeyId: accessKey,
  secretAccessKey: secretKey,
  region: 'us-east-1',
});

const sns = new AWS.SNS();

const sendSMS = async (message, number) => {
  return await new Promise((resolve, reject) => {
    sns.publish({
      Message: message,
      MessageStructure: 'string',
      PhoneNumber: number,
    }, (err, res) => {
      if …
Run Code Online (Sandbox Code Playgroud)

sms amazon-web-services node.js amazon-sns aws-sdk

12
推荐指数
1
解决办法
749
查看次数

允许Lambda的S3策略

我对使用AWS策略生成器创建的S3存储桶具有以下策略,以允许以特定角色运行的lambda访问存储桶中的文件.但是,当我执行Lambda时,我获得403权限被拒绝:

"errorMessage": "Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: <requestId>)",
  "errorType": "com.amazonaws.services.s3.model.AmazonS3Exception",
Run Code Online (Sandbox Code Playgroud)

S3存储桶的策略:

{
"Version": "2012-10-17",
"Id": "Policy<number>",
"Statement": [
    {
        "Sid": "Stmt<number>",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::<account>:role/<roleName>"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::<bucketName>/*"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

这个政策有什么问题?Lamba正在使用策略中配置的角色运行.

amazon-s3 amazon-web-services aws-sdk aws-lambda

12
推荐指数
2
解决办法
2万
查看次数

如何使用Cognito返回的代码获取AWS凭据?

现在,我正在努力了解AWS Cognito所以也许有人可以帮助我.我设置了一个域来为我的用户池提供Cognito的托管UI,就像这里描述的那样.因此,当我访问时,https://<my-domain>.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=<MY_POOL_CLIENT_ID>&redirect_uri=https://localhost:8080我会看到一个登录页面,我的用户可以通过Google登录我的应用程序.那部分工作得很好.

我很困惑在用户登录后如何处理从该页面返回的代码.因此,一旦我被重定向到Google并授权应用程序查看我的信息,我将被重定向回我的一个URL并带有代码查询参数.现在我正在重定向到localhost,因此重定向URL如下所示:

https://localhost:8080/?code=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX

这段代码究竟是什么?另外,如何使用它来为我的用户访问AWS资源?

javascript amazon-web-services amazon-cognito aws-sdk aws-cognito

12
推荐指数
3
解决办法
5666
查看次数

TRIM_HORIZON vs LATEST

我无法在正式文档中找到检查点之间的AWS Kinesis任何明确引用,TRIM_HORIZON以及检查点之间的任何引用LATEST.

你能证实我的理论:

  • TRIM_HORIZON - 如果应用程序名称是新的,那么我将读取流中可用的所有记录.否则,应用程序名称已经使用,然后我将从我的上一个检查点读取.

  • LATEST- 如果应用程序名称是新的,那么我将读取在订阅流之后添加的流中的所有记录.否则,应用程序的名称已经使用,我会阅读的邮件我的最后一道关卡.

  • TRIM_HORIZON和之间的区别LATEST仅在于应用程序名称是新的.

amazon-web-services amazon-kinesis aws-sdk amazon-kcl

12
推荐指数
2
解决办法
8193
查看次数

我的Lambda在启动和第一线之间做了什么?

我在AWS中运行在.NET Core 2.1运行时的C#中编写了一些Lambda函数.它们的冷启动时间非常大(> 8s,256MB,> 4s,512).

但是,我不确定它是冷启动时间还是别的什么; 我有其他使用dotnet编写的lambda,它们似乎有更短的启动时间.

X射线迹线显示完成"启动"和发生任何事情之间存在巨大差距.我在我的处理程序的第一行开始一个X射线子段(在跟踪中看作"配置").

有什么我想念的吗?

AWS X-Ray跟踪

aws-sdk .net-core aws-lambda aws-xray

12
推荐指数
1
解决办法
618
查看次数

如何模拟 AWS sqs 调用进行单元测试

我在 Node 应用程序中使用 AWS SQS 队列,我必须为此编写单元测试用例。为此,我想模拟sendMessage()测试文件中的 SQS 函数调用,我该怎么办?

我曾尝试使用,aws-sdk-mock但在调用 时sendMessage(),该函数正在尝试连接到队列 URL。

测试文件

import AWSMock from 'aws-sdk-mock'
import sendMessage from '../api/sqs/producer'

describe.only('Test case for SQS SendMessage', () => {
  it('should return the UserEvent', async () => {
    AWSMock.mock('SQS', 'sendMessage', () => Promise.resolve('Success'))
    const res = await sendMessage('testURL', 'data')
    console.log('RES', res.response.data)
  })
})
Run Code Online (Sandbox Code Playgroud)

生产者文件

const AWS = require('aws-sdk')

const sqs = new AWS.SQS({
  region: 'us-east-1'
})

const sendMessage = async (msg, queueUrl) => {
  try { …
Run Code Online (Sandbox Code Playgroud)

javascript unit-testing node.js jestjs aws-sdk

12
推荐指数
1
解决办法
2万
查看次数

使用 AWS Java SDK v2 从 AWS EKS 获取身份验证令牌

如何使用 AWS Java SDK v2 从 AWS EKS 获取 Kubernetes 身份验证令牌?然后可用于使用 Kubernetes SDK 向 Kubernetes 进行身份验证的身份验证令牌。换句话说,我想从 EKS 获取身份验证令牌以用于与 Kubernetes 的身份验证,这样我就不必创建“kube 配置”。

我实际上得到了一个使用 AWS Java SDK v1(而不是 v2)的解决方案,查看以下open issue中的代码示例。这里还有一个 Python 代码示例但我在使用 AWS Java SDK v2 时没有取得任何成功。我尝试使用 AWS Java SDK v2 执行此操作:

public static String getAuthenticationToken(AwsCredentialsProvider awsAuth, Region awsRegion, String clusterName) {
    try {
        SdkHttpFullRequest requestToSign = SdkHttpFullRequest
                .builder()
                .method(SdkHttpMethod.GET)
                .uri(new URI("https", String.format("sts.%s.amazonaws.com", awsRegion.id()), null, null))
                .appendHeader("x-k8s-aws-id", clusterName)
                .appendRawQueryParameter("Action", "GetCallerIdentity")
                .appendRawQueryParameter("Version", "2011-06-15")
                .build();

        ZonedDateTime expirationDate = DateUtil.addSeconds(DateUtil.now(), 60); …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services kubernetes aws-sdk amazon-eks aws-java-sdk-2.x

12
推荐指数
1
解决办法
1991
查看次数