标签: aws-lambda

Athena 查询失败并显示:“没有足够的权限来执行查询”

我正在编写一个 lambda 函数,该函数应该对 Athena 发起查询,当我执行 start_query_execution 时,它会成功,但当我稍后尝试获取查询状态时,我会看到以下内容:

'Status': {'State': 'FAILED', 'StateChangeReason': 'Insufficient permissions to execute the query. User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/test_role/test-audit is not authorized to perform: glue:GetTable on resource: arn:aws:glue:us-east-1:XXXXXXXXXXXX:catalog ', 'SubmissionDateTime': datetime.datetime(2019, 9, 16, 17, 13, 18, 749000, tzinfo=tzlocal()), 'CompletionDateTime': datetime.datetime(2019, 9, 16, 17, 13, 31, 197000, tzinfo=tzlocal())}
Run Code Online (Sandbox Code Playgroud)

为 lambda 分配了一个 IAM 角色,该角色具有以下权限:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:*",
            "dynamodb:*",
            "kinesis:*",
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "cloudwatch:PutMetricData",
            "athena:*",
            "glue:*",
            "redshift:*"
        ],
        "Resource": [
            "*"
        ],
        "Effect": "Allow"
    }
]
} …
Run Code Online (Sandbox Code Playgroud)

python amazon-s3 amazon-iam aws-lambda amazon-athena

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

API网关:无法启用CORS

我无法在 API 网关实例上启用 CORS,如下所示:

1、设置: 在此输入图像描述

2、结果: 在此输入图像描述

我已经尝试了很多事情,例如检查DEFAULT 4XX和DEFAULT 5XX并按照某些帖子中的建议手动输入 Access-Control-Allow-Methods 。

如果我将鼠标悬停在错误上,我会得到:Invalid Response status code specified。

我可以使用浏览器获取数据,但只能通过邮递员完成 POST 操作。我的 ReactJS 网站也不会发布,抛出:

Access to XMLHttpRequest at <ENDPOINT> from origin <S3-REACT-BUCKET> has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我读到我的 React 应用程序应该发送 CORS 标头(尚未实现),但我什至无法在 API 网关中启用 CORS!

cors aws-lambda aws-api-gateway serverless-framework serverless

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

跨源请求的 502 bad gateway 错误

我正在使用该serverless框架将我的 lambda 部署到 AWS,并且已经能够通过 Postman 成功地将 POST 请求运行到与我的 lambda 函数关联的 API 网关,但是当我尝试从表单提交(AJAX 请求)运行 POST 请求时本地服务器我收到 502 错误消息,

Access to XMLHttpRequest at 'https://*id*.execute-api.us-east-1.amazonaws.com/prod/message' from origin 'http://localhost:2368' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Run Code Online (Sandbox Code Playgroud)

这是我没想到的,因为cors我的 set 中有属性serverless.ymlto true,它为 HTTP 端点设置 CORS 配置。这是函数 yaml 设置:

functions:
  email:
    handler: handler.sendEmail
    events:
      - http:
          path: message
          method: post
          cors: true
Run Code Online (Sandbox Code Playgroud)

这是 jQuery AJAX 请求:

$.ajax({
    type: 'POST',
    url: 'https://*id*.execute-api.us-east-1.amazonaws.com/prod/message',
    crossDomain: …
Run Code Online (Sandbox Code Playgroud)

ajax aws-lambda aws-api-gateway serverless-framework

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

AWS IAM 理解问题

我正在运行一个 lambda,它将通过使用 boto3 自动触发一个理解作业。

但是,由于某种原因,我的 IAM 无法工作!我对此工作的角色拥有以下权限:

  • IAM完全访问
  • AmazonS3完全访问
  • 理解完全访问
  • AWSLambda执行

但是,当在 comprehend 中创建作业时,它立即失败并显示以下错误消息:

NO_WRITE_ACCESS_TO_OUTPUT: The provided data access role does not have write access to the output S3 URI.

有想法该怎么解决这个吗?我已授予该角色完整的 S3 权限?

amazon-s3 amazon-web-services amazon-iam aws-lambda amazon-comprehend

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

如何仅在不存在时创建 terraform 资源

我正在使用 terraform 在 AWS 中创建一个角色。由于IAM是非区域服务,我只想创建一次角色。因此,每当我运行 terraform 时,它都应该检查该角色是否已经存在,如果不存在,它应该创建一个。

data "aws_iam_role" "iam_role_check" {
  name = "some_role"
}

resource "aws_iam_role" "iam_role" {
  count= "${data.aws_iam_role.iam_role_check != "null" ? 0 : 1}"
  name = "some_role"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}
Run Code Online (Sandbox Code Playgroud)

data.aws_iam_role.iam_role_check:正在刷新状态...

错误:读取 IAM 角色 (some_role) 时出错:NoSuchEntity:找不到名为 some_role 的角色。状态码:404,请求ID:

amazon-web-services aws-lambda terraform terraform-provider-aws

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

将 AWS Lambda 与 Amazon DocumentDB 变更流结合使用

我希望通过侦听 DocumentDB 更改流,通过 lambda 函数填充 SQS 队列。我知道这可以通过DynamoDB来完成。有没有办法用 DocumentDB 来实现这一点?

mongodb aws-lambda aws-documentdb

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

在 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
查看次数

使用特定选项或环境变量在 AWS lambda 中启动 NodeJS 运行时

执行 AWS Lambda 时出现 NodeJS 弃用错误(使用节点 12.x):

[DEP0066] DeprecationWarning: OutgoingMessage.prototype._headers is deprecated
Run Code Online (Sandbox Code Playgroud)

无法找到哪个模块/代码片段正在生成它。似乎没有任何内容引用_headers或_headerNames。

在 Node 中应该可以设置参数或环境变量,如此处解释为--trace-deprecation和/或--trace-warnings和/或--throw-deprecation。在 lambda 的 AWS 控制台环境变量中设置一个或多个这些值时,不会显示任何额外信息。

AWS lambda 环境变量

为 AWS Lambda 设置此运行时参数的方法是什么?有没有办法捕获堆栈跟踪以了解不推荐使用的错误发生在哪里?

amazon-web-services node.js aws-lambda serverless-framework

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

使用 CFLAGS 和 PIP 缩小 AWS Lambda 部署包以适应 sklearn

我正在使用 Lambda 处理程序加载腌制的机器学习模型,因此我需要 sklearn(如果未包含,我会收到“ModuleNotFoundError:没有名为 'sklearn' 的模块”)

因此,我使用 sklearn 在 Docker 中创建了一个新的部署包。

但是当我尝试上传新的 lambda.zip 文件时,我无法保存 lambda 函数。我收到错误:解压后的大小必须小于 262144000 字节

我做了一些谷歌搜索,发现了两个建议:(1)将 CLFAG 与 PIP 结合使用,(2)使用 Lambda Layers。

我不认为图层会起作用。将我的部署包的部分内容移动到层不会减少总大小(并且AWS 文档指出“函数和所有层的解压缩总大小不能超过解压部署包大小限制 250 MB”。

CFLAGS 听起来很有希望,但我以前从未使用过 CFLAGS,并且遇到了错误。

我正在尝试添加标志:-Os -g0 -Wl,--strip-all

在 CLFAGS 之前,我的 docker pip 命令是:pip3 install requests pandas s3fs datetime bs4 sklearn -t ./

首先我尝试:pip3 install requests pandas s3fs datetime bs4 sklearn -t -Os -g0 -Wl,--strip-all ./

这产生了各种错误“没有这样的选项:-g”

然后我尝试了CFLAGS = -Os -g0 -Wl,--strip-all pip3 …

python pip amazon-web-services scikit-learn aws-lambda

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

使用 Java 的 gradle 与 AWS Lambda Layers 进行有效开发,用于 Spring Boot 应用程序

我想要提高 Lambda 开发效率。我期望的最终状态是将我的开发过程分为 2 个不同的构建:

  • Lambda Layer Build - 构建我的 Lambda 层,其中包含我的项目的所有依赖项
  • 应用程序代码 - 没有所有依赖项的实际应用程序

我很高兴利用serverless framework与 Lambda 的集成,但我仍然无法弄清楚如何获取 gradle 而不是构建 FatJar,从而拥有一个包含所有依赖项的文件夹/ja​​r,以及我的应用程序代码之一。

我在这里尝试过这个教程,它的功能如下:

task buildZip(type: Zip) {
    baseName = "aws-java-github-webhook-gitstats"
    from compileJava
    from processResources
//    into('lib') {
//        from configurations.runtime
//    }
}


task buildLayer(type: Copy) {
    into "$buildDir/layer/java/lib"
    from configurations.runtime
}
Run Code Online (Sandbox Code Playgroud)

但我认为该spring-dependency插件搞乱了这种方法(我正在使用spring-boot)。有谁有一个很好的配置设置来做到这一点,我可以利用吗?

gradle spring-boot aws-lambda aws-lambda-layers

7
推荐指数
0
解决办法
1112
查看次数