标签: aws-lambda

如何验证 getOpenIdTokenForDeveloperIdentity 认知令牌

我正在使用 aws lambdas、dynamodb 和 cognito 构建身份验证系统。

坚持比较 getOpenIdTokenForDeveloperIdentity() 提供的令牌;调用来自服务器的特定身份。

我正在通过以下方式获取令牌和身份:

function getToken(email, fn) {
    var param = {
        IdentityPoolId: cognitoIdentityPoolId,
        Logins: {} // To have provider name in a variable
    };
    param.Logins[cognitoDeveloperProvidedName] = email;
    cognitoidentity.getOpenIdTokenForDeveloperIdentity(param,
        function(err, data) {
            if (err) return fn(err); // an error occurred
            else fn(null, data.IdentityId, data.Token); // successful response
        });
}
Run Code Online (Sandbox Code Playgroud)

然后据我所知,我可以从 cognito 中获取已经生成的令牌(而不是创建一个新令牌),如下所示:

function checkToken(IdentityId, email, fn){
    var param = {
        IdentityPoolId: cognitoIdentityPoolId,
        IdentityId: IdentityId,
        Logins: {}
    };
    param.Logins[cognitoDeveloperProvidedName] = email;
    cognitoidentity.getCredentialsForIdentity(param, 
        function(err, data) { …
Run Code Online (Sandbox Code Playgroud)

javascript amazon-web-services amazon-cognito aws-lambda

7
推荐指数
1
解决办法
2715
查看次数

如何让 Terraform archive_file 资源获取对源文件的更改?

在 Win 10 机器上使用 TF 0.7.2。

我正在尝试使用 TF 0.7.1 中引入的新“archive_file”资源,为在 AWS 中开发我的 lambda 函数设置编辑/上传周期

我的配置是这样的:

resource "archive_file" "cloudwatch-sumo-lambda-archive" {
  source_file = "${var.lambda_src_dir}/cloudwatch/cloudwatchSumologic.js"
  output_path = "${var.lambda_gen_dir}/cloudwatchSumologic.zip"
  type = "zip"
}

resource "aws_lambda_function" "cloudwatch-sumo-lambda" {
  function_name = "cloudwatch-sumo-lambda"
  description = "managed by source project"
  filename = "${archive_file.cloudwatch-sumo-lambda-archive.output_path}"
  source_code_hash = "${archive_file.cloudwatch-sumo-lambda-archive.output_sha}"
  handler = "cloudwatchSumologic.handler"

  ...
}
Run Code Online (Sandbox Code Playgroud)

这在我第一次运行时有效 - TF 创建 lambda zip 文件,上传它并在 AWS 中创建 lambda。问题在于更新 lambda。

如果我在上面的示例中编辑 cloudwatchSumologic.js 文件,TF 似乎不知道源文件已更改 - 它不会将新文件添加到 zip 并且不会将新的 lambda 代码上传到 AWS。

我在配置中做错了什么,还是不打算以这种方式使用 archive_file 资源?

aws-lambda terraform

7
推荐指数
1
解决办法
3028
查看次数

如何在 AWS AMI Linux Lambda 中设置语言环境?

我在 python 中有一个小脚本,它利用语言环境来格式化从 1.000,00 到 1,000.00 的数字

import re, locale
locale.setlocale(locale.LC_ALL, 'es_PE.UTF-8')

locale.atof(number)
Run Code Online (Sandbox Code Playgroud)

然后当我在 Lambda 中运行它时,我收到以下错误消息:

不支持的区域设置

我知道如何通过在终端中执行以下命令在我的 PC 中安装依赖项:

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

来源:https : //stackoverflow.com/a/36257050/2513972

python-3.x aws-lambda amazon-ami

7
推荐指数
1
解决办法
892
查看次数

使用 Winston 日志记录的 AWS Lambda 丢失请求 ID

当console.log用于将日志行添加到 AWS CloudWatch 时,Lambda 请求 ID 被添加到每行,如文档中所述

基于上述文档的简化示例

exports.handler = async function(event, context) {
  console.log("Hello");
  return context.logStreamName
};
Run Code Online (Sandbox Code Playgroud)

会产生输出,如

开始请求 ID:c793869b-ee49-115b-a5b6-4fd21e8dedac 版本:$LATEST

2019-06-07T19:11:20.562Z c793869b-ee49-115b-a5b6-4fd21e8dedac 信息你好

END 请求 ID:c793869b-ee49-115b-a5b6-4fd21e8dedac

REPORT RequestId:c793869b-ee49-115b-a5b6-4fd21e8dedac 持续时间:170.19 ms 计费持续时间:200 ms 内存大小:128 MB 已用最大内存:73 MB

此处关于此问题的相关详细信息是请求 ID,c793869b-ee49-115b-a5b6-4fd21e8dedac它添加在带有“Hello”的行上的时间戳之后。

AWS 文档指出

要从函数代码输出日志,您可以使用控制台对象上的方法,或任何写入 stdout 或 stderr 的日志库。

Node.js 运行时会记录每次调用的 START、END 和 REPORT 行,并向函数记录的每个条目添加时间戳、请求 ID 和日志级别。

使用 Winston 作为记录器时,请求 ID 会丢失。可能是带有格式化程序或传输的问题。记录器是这样创建的

const logger = createLogger({
    level: 'debug',
    format: combine(
      timestamp(),
      printf(
        ({ timestamp, level, message }) …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services winston aws-lambda amazon-cloudwatchlogs

7
推荐指数
1
解决办法
3850
查看次数

如何下载 AWS Lambda 层

是否可以使用 AWS CLI 下载 Lambda 层?

我见过这个记录的命令。 https://docs.aws.amazon.com/lambda/latest/dg/API_GetLayerVersion.html

但是当我尝试用下面的东西运行它时。

aws lambda get-layer-version --layer-name arn:aws:lambda:us-east-1:209497400698:layer:php-73 --version-number 7
Run Code Online (Sandbox Code Playgroud)

我收到这个错误。

调用 GetLayerVersion 操作时发生错误 (InvalidParameterValueException):Invalid Layer name: arn:aws:lambda:us-east-1:209497400698:layer:php-73

是否可以通过 CLI 下载层?

作为额外说明,我正在尝试下载这些层中的任何一个 https://runtimes.bref.sh/

aws-cli aws-lambda

7
推荐指数
1
解决办法
4142
查看次数

Cloudfront 和 Lambda@Edge:删除响应标头

我正在尝试在 ViewerResponse 事件上使用 Lambda@Edge 从 Cloudfront 响应中删除一些标头。源是一个 S3 存储桶。

我已经成功地改变了这样的标题:

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;
    response.headers.server = [{'key': 'server', 'value': 'bunny'}];
    callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)

但是,将所有标题一起删除似乎不起作用,例如像这样。

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;
    delete response.headers.server;
    // or response.header.server = null;
    // or response.headers.server = [{'key': 'server', 'value': null}];
    callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)

此代码段不会删除但将服务器标头从 更改server: AmazonS3为server: CloudFront。所以我假设服务器标头可能是强制性的并且会自动填充。但我也无法删除 CloudFront 生成的其他标头。在 lambda 测试窗格中,该函数按预期工作。所以在 Lambda 函数完成后会发生一些事情。

作为背景,我想更改标题,因为该站点在重要客户的网络中被阻止,并显示它是在线存储或备份位置的消息。

我错过了什么?

javascript amazon-s3 amazon-cloudfront aws-lambda

7
推荐指数
1
解决办法
4204
查看次数

AWS Textract StartDocumentAnalysis 函数未向 SNS 主题发布消息

我正在使用 AWS Textract 并且我想分析一个多页文档,因此我必须使用异步选项,所以我首先使用了startDocumentAnalysis函数,我得到了一个 JobId 作为返回,但它需要触发一个我设置为的函数当 SNS 主题收到消息时触发。

这些是我的无服务器文件和处理程序文件。

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: us-east-1
  iamRoleStatements:
    - Effect: "Allow"
      Action:
       - "s3:*"
      Resource: { "Fn::Join": ["", ["arn:aws:s3:::${self:custom.secrets.IMAGE_BUCKET_NAME}", "/*" ] ] }
    - Effect: "Allow"
      Action:
        - "sts:AssumeRole"
        - "SNS:Publish"
        - "lambda:InvokeFunction"
        - "textract:DetectDocumentText"
        - "textract:AnalyzeDocument"
        - "textract:StartDocumentAnalysis"
        - "textract:GetDocumentAnalysis"
      Resource: "*"

custom:
  secrets: ${file(secrets.${opt:stage, self:provider.stage}.yml)}

functions:
  routes:
    handler: src/functions/routes/handler.run
    events:
      - s3:
          bucket: ${self:custom.secrets.IMAGE_BUCKET_NAME}
          event: s3:ObjectCreated:*

  textract:
    handler: src/functions/routes/handler.detectTextAnalysis
    events:
      - sns: "TextractTopic"

resources:
  Resources: …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-sdk aws-lambda aws-sdk-nodejs amazon-textract

7
推荐指数
3
解决办法
1868
查看次数

如何修复 AttributeError:模块 'botocore.vendored.requests' 没有属性 'Post' Traceback

我正在尝试让我的 LexBot 与 Lambda 进行通信,因此我遵循了创建请求、签名以及执行此操作所需的一切的过程。但我不确定是否需要从 Python 导入某些东西。当我要发布消息时它失败了。创建签名以及 auth 标头。

请大家指教,任何帮助将不胜感激!

我使用这些文章作为指导:https : //docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html

https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html

print ('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')
print ('Request URL = ' + endpoint)
print('\n' + authorization_header)
print('\nX-Amz-content-Sha256 header is' + payload_hash)

r = requests.Post ('myendpoint'+ canonical_uri, data=payload, 
headers=headers)
data = r.json()
lex_message = data['message']
print ('' + lex_message)
Run Code Online (Sandbox Code Playgroud)

所以我假设我的问题来自这段代码,注意我删除了我的端点。

也不确定请求中的数据是什么。

amazon-web-services python-3.x aws-lambda

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

在 AWS Lambda 中接收和发送多部分/表单数据文件

我正在尝试对multipart/form-dataAWS lambda 函数执行包含 pdf 文件的 POST,对文件进行一些检查,然后将文件 POST 到外部 API。

我使用带有 node.js 的无服务器框架和aws-lambda-multipart-parser插件来接收文件。

从客户端到 lambda 的文件上传工作正常,我可以将缓冲区内容打印到控制台。不起作用的部分是将文件转发到外部 API。

这是我当前的 axios 设置,用于向外部 API 发出 POST 请求:

const formData = new FormData();
formData.append("file", file.content, file.filename);

const res = await axios.post(`https://external-api.com`, formData, {
  headers: { ...formData.getHeaders(), "Access-Control-Allow-Origin": "*" },
  params: {
    someParams: foo
  }
});
Run Code Online (Sandbox Code Playgroud)

file.content实际上包含一个包含文件内容的 Buffer,但是当我发出请求时,外部 API 返回错误并且请求失败...

有趣的是,当我在本地运行无服务器功能时,整个设置有效sls offline。这可能表明 API 网关设置存在问题。

一些附加信息:

根据多部分插件的说明,我在 API 网关设置中添加了二进制数据类型:

在此输入图像描述

这是 AWS Gateway 中终端节点的配置:

在此输入图像描述

我也尝试了这个SO问题和AWS文档,但它们只介绍了如何接收二进制文件,而不是如何发送二进制文件。 …

amazon-web-services aws-lambda aws-api-gateway serverless-framework serverless

7
推荐指数
1
解决办法
9254
查看次数

创建或更新 dynamodb

目前,我正在通过查询检查该项目是否存在,然后我正在使用 put 或 updateItem,我想更改它并对 DDB 进行一次调用。我想进行一个将更新或创建项目的查询。

这是我的项目的一个例子:

{
   id: 'dsfadsf'
   fa: { "apple" : { "S" : "76-100" }, "yolo" : { "S" : "0-25" }
   pa: { "finish" : { "BOOL" : false },    "userKey" : { "S" : "3e299e12-9e66" }  }
   createdAt: 32432432423
}
Run Code Online (Sandbox Code Playgroud)

物品类型:

createdAt - Number
fa - Map
pa - Map
id - String
finish - Boolean
key - String
Run Code Online (Sandbox Code Playgroud)

如果项目存在,我想推送一个新项目,如 {papa: 'dsfadsf'}(永远不要修改 fa Map 内的现有项目)并修改 pa Map 内的完成值

这是更新后的项目:

{
   id: 'dsfadsf'
   fa: { …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js amazon-dynamodb aws-lambda

7
推荐指数
1
解决办法
1965
查看次数