我是nodejs和aws的新手,谁能指出以下用于调整s3存储桶中图像大小的代码有什么问题吗
程序如下
'use strict';
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
accessKeyId: "xxxxxxxxxxxx",
secretAccessKey: "yyyyyyyyyyy",
region: "us-east-1",
signatureVersion: 'v4',
});
const Sharp = require('sharp');
const BUCKET = "patientimg";
const URL = "https://s3.ap-south-1.amazonaws.com";
exports.handler = function(event, context, callback) {
const key = event.queryStringParameters.key;
const match = key.match(/(\d+)x(\d+)\/(.*)/);
const width = parseInt(match[1], 10);
const height = parseInt(match[2], 10);
const originalKey = match[3];
S3.getObject({Bucket: BUCKET, Key: originalKey}).promise()
.then(data => Sharp(data.Body)
.resize(width, height)
.toFormat('png')
.toBuffer()
)
.then(buffer => S3.putObject({
Body: buffer,
Bucket: …Run Code Online (Sandbox Code Playgroud) 我正在尝试根据以下示例从 CloudFormation 模板创建 lambda 函数:
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-lambda.html
从这个链接可以看出:
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html
无法为 lambda 函数添加触发器(如 S3 上传触发器)。
是否有解决方法可以在编写模板时指定触发器?
我对 AWS lambda 不太了解。我的要求是在文件复制到 S3 存储桶后运行 Glue 作业。
因此,我计划使用 AWS Lamdba 启动 AWS Glue 作业。但 Lambda 函数有 300 毫秒的限制,而我的 Glue 工作将需要几个小时。
我的问题是 Lambda 将如何工作,它会启动 Glue 作业并退出吗?或者如果我们杀死 lambda job,Glue job 也会被杀死吗?
如果我们杀死 lambda 作业,胶水作业也会被杀死。那么还有什么其他解决方案呢?
我在 AWS 上使用 codepipeline、codebuild 和 cloudformation。
我的流程是:
云信息(简化):
CreateDoctorLambda:
Type: AWS::Lambda::Function
Properties:
Runtime: python3.6
Handler: lambda_function.lambda_handler
Role:
Fn::GetAtt:
- LambdaExecutionRole
- Arn
Code:
S3Bucket: !Ref LambdaFunctionS3Bucket
S3Key: CreateDoctor.zip
S3ObjectVersion: Latest <-- This value is invalid
Run Code Online (Sandbox Code Playgroud)
问题:当我更新 lambda 函数的代码时(此新代码在代码构建期间被压缩并上传到 S3 存储桶),更改不会部署到现有的 lambda 函数。
根据AWS 文档:
要更新源代码位于 Amazon S3 存储桶中的 Lambda 函数,您必须通过更新 S3Bucket、S3Key 或 S3ObjectVersion 属性来触发更新。单独更新源代码并不会更新功能。
问题:有没有办法告诉Cloudformation使用S3中存储的最新版本的代码?使用S3ObjectVersion: Latest会导致错误。
我正在编写一个 python 3 AWS Lambda 例程,它将从 Lambda 事件对象获取 S3 存储桶和密钥 (source_key),并将文件复制到具有相同密钥值 (Destination_key) 的另一个 S3 存储桶。
但是,事件对象中的 S3 Key 的编码方式使得当我使用 source_key 值写入目标存储桶时,S3 会抛出 404 错误。
S3 Lambda 事件对象返回的密钥:
'object': {'key': 'SBN-Fwd_+USPS+-+Springdale%2C+OH+-+Mail+Processing+Facility+-+Bid+Extension+Notice.eml'
Run Code Online (Sandbox Code Playgroud)
将“key”值提交回 S3 时出错:
{'Error': {'Code': 'NoSuchKey', 'Message': 'The specified key does not exist.', 'Key': 'SBN-Fwd_+USPS+-+Springdale%2C+OH+-+Mail+Processing+Facility+-+Bid+Extension+Notice.eml'}, 'ResponseMetadata': {'RequestId': '2C0154D58032B5B4', 'HostId': 'zxp56SHdODohW5ln8B5GOW+YPqGfL4/kJGD+qV46yMhLZU92BrOC/hlh/HPHywAuGuJiICL0RFk=', 'HTTPStatusCode': 404, 'HTTPHeaders': {'x-amz-request-id': '2C0154D58032B5B4', 'x-amz-id-2': 'zxp56SHdODohW5ln8B5GOW+YPqGfL4/kJGD+qV46yMhLZU92BrOC/hlh/HPHywAuGuJiICL0RFk=', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'date': 'Thu, 20 Sep 2018 16:40:00 GMT', 'server': 'AmazonS3'}, 'RetryAttempts': 0}}
Run Code Online (Sandbox Code Playgroud)
我只是使用 boto3 将source_key 复制到destination_key,同时指定不同的存储桶。
copy_source = {'Bucket': source_bucket, …Run Code Online (Sandbox Code Playgroud) 我有一个基于 HTTPS 的网站,我想向 HTTP 端口发出 GET 请求。目前,当我尝试时,我收到以下错误:
cannot load ${url} due to access control checks.
this page was not allowed to display insecure content from ${http-url}
Run Code Online (Sandbox Code Playgroud)
我考虑过将请求放入 AWS lambda 函数并调用 labmda 函数,因为这会给我一个 HTTPS URL?这可能吗。
即便如此,我想知道最简单的方法是什么,因为我对 AWS 不太了解,所以我必须学习它。
const url = 'http://website/fmi/xml/fmresultset.xml?-dbnames';
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function (params) {
console.log(xhttp.status);
if (xhttp.readyState ==4) {
if (xhttp.status == 200) {
console.log('====');
console.log(xhttp.responseText);
}
}
}
xhttp.open("GET", url, true);
xhttp.send();
Run Code Online (Sandbox Code Playgroud) 我有一个要求,希望确保所有单独的 Lambda 函数都使用最新版本的运行时。
使用 CLI cmd:aws lambda get function我能够获取该特定 lambda 函数的运行时版本,但我想确保它使用最新的语言版本。
浏览 Lambda 的 Aws 文档https://docs.aws.amazon.com/cli/latest/reference/lambda我无法找到任何可以判断哪些可用运行时的 API,也许从该列表中我可以确定哪个是最新的(也许通过检查该特定语言的最高版本号)。
所以只是想知道是否有我找不到的 AWS API 或者其他可以实现这一目标的方法?
注意:我不是在谈论 Lambda 函数版本控制,而是在谈论语言运行时版本。
例如,目前 AWS lambda 的最新运行时是 Node.js 8.10。因此,如果任何 Lambda 函数使用 Node.js 6.10 作为运行时,那么我想突出显示该 Lambda 函数。
我正在编写一个 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) 我无法在 API 网关实例上启用 CORS,如下所示:
我已经尝试了很多事情,例如检查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
我正在使用该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) aws-lambda ×10
amazon-s3 ×5
ajax ×1
amazon-iam ×1
aws-cli ×1
aws-glue ×1
cors ×1
http ×1
https ×1
javascript ×1
node.js ×1
python ×1
python-3.x ×1
serverless ×1