我创建了一个 Lambda 函数,它从 DynamoDB 检索一些数据,并输出一些 JSON。我想做的是在 lambda@edge 中运行这个函数并生成一个响应,我可以使用 Cloudfront 缓存该响应。
\n\n我面临的问题是,我在 DynamoDB 中的数据(当前)使用全局表复制到两个区域(us-east-2 和 eu-west-1),而 lambda@edge 显然在许多区域中运行。
\n\n这让我无法使用AWS_REGION在 lambda 环境中使用。例如,如果请求在 us-west-1 中运行,环境变量将反映这一点,并且它会尝试从 us-west-1 检索数据,而数据实际上应该转到 us-east-2。
虽然我承认我还没有尝试过这个(但)我想知道我是否可以在 Route53 中设置自己的基于延迟的路由,以将 ddb.mydomain.com 指向我使用的区域中 DynamoDB 的端点(假设 SAN 证书是)设置一下可以吗?
\n\n我想也许我可以根据下面的示例映射代码中的区域
\n\nconst process = { env: { AWS_REGION: \'us-east-1\' } };\n\nconst regions = {\n \'eu-west-1\': [\'eu-west-1\', \'eu-central-1\', \'...\'],\n \'us-east-2\': [\'us-west-1\', \'us-east-1\', \'...\'],\n};\n\nconst activeRegions = Object.keys(regions);\n\nconst region = activeRegions.find(\n key => regions[key].includes(process.env.AWS_REGION)\n) || activeRegions[0];\n\nconsole.log(region) // us-east-2\nRun Code Online (Sandbox Code Playgroud)\n\n这感觉维护起来比其价值要多,并且依赖于我对最佳选择区域的假设。我还必须保持我的区域列表是最新的。
\n\n我可以仅使用该区域的前两个字母来限制当新数据中心稍微开放时更新它的需要,但它仍然不理想 …
我无法使用 .NET Core 2.1 MVC 与 AWS Lambda 函数一起使用 cookie 身份验证。
我尝试过很多 cookie 选项的变体。我能够登录并看到在响应中创建的 asp cookie,但通常在刷新或单击任何链接(例如对服务器的下一个请求)后,我会返回到登录屏幕。*更新:看来我现在只需要登录两次并且保持登录状态。这也是使用 .net 2.1 的第二个 Lambda 函数,我注意到了这种行为。
我已经配置了 API 网关,该网关使用使用适用于 Visual Studio 的 AWS 扩展进行部署时设置的默认值。
我当前的startup.cs代码,适用于本地主机:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
// Cookie settings
options.Cookie.SameSite = SameSiteMode.Lax;
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.LoginPath = "/Login";
options.LogoutPath = "/Logout";
options.AccessDeniedPath = "/Login";
options.Cookie.Name = "myapp.auth";
options.Cookie.HttpOnly = true;
options.Cookie.Expiration = TimeSpan.FromDays(1);
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings, only this changes expiration
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromDays(1);
});
services.AddAntiforgery(options …Run Code Online (Sandbox Code Playgroud) 我正在尝试部署 lambda@edge 函数(一个修改来自 Cloudfront 发行版的 HTML 的 AWS Lambda 函数)并在保存时获得此神秘响应:
有谁知道Cannot read properties of undefined (reading 'startsWith')这里指的是什么,或者我该如何解决这个问题?任何指示都会有帮助!
amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge
我正在使用CloudFormation来管理CloudFront 分配。
在这个CloudFront 发行版中,我关联了一个Lambda Edge 函数(不使用 CloudFormation)。
问题是稍后,当我使用相同的 CloudFormation 堆栈更新 CloudFront 分配时,它会删除所有 Lambda Edge 关联。
如何防止?
真是太可惜了。。
PS:有时 CloudFormation 会删除 Lambda 关联(例如更新证书 ARN 时),有时不会。
编辑:我可以尝试使用https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html但有没有更简单的方法?不..
编辑:AWS 论坛上的相同问题https://forums.aws.amazon.com/thread.jspa?threadID=274111(需要登录)
amazon-web-services amazon-cloudfront aws-cloudformation aws-lambda aws-lambda-edge
我有一个不完全正统的 CF->S3 设置。这里的相关组件是:
Cloudfront 分布origin s3.ap-southeast-2.amazonaws.com
Lambda@Edge 函数(源请求),添加 S3 授权(版本 2)查询字符串(使用函数使用的 S3 策略进行签名)。
从 Lambda 返回的请求完全正确。如果我记录 uri、主机和查询字符串,我就会得到我请求的文件。但是,如果我直接通过 Cloudfront 链接访问它,请求会失败,因为它不再使用AWSAccessKeyID,而是选择使用x-amz-cf-id(但使用相同的签名、Amz-Security-Token 等)。更正:它可能不会取代,但需要补充。
我知道是这种情况,因为我已经返回了
StringToSign和SignatureProvided。它们都与 Lambda 响应匹配,除了AWSAccessKeyID已替换为x-amz-cf-id.
显然这是一个非常具体的问题。我可能需要考虑重塑这个架构,但我不想这样做。有几个要求导致我放弃了这个不完全常规的设置。
amazon-s3 amazon-web-services amazon-cloudfront aws-lambda-edge
为 AWS Lambda@Edge 实施本地缓存的最佳方法是什么?
上下文如下:我们在 CloudFront 中有 lambda@edge 触发器,需要从公共互联网检索公钥。该密钥定期轮换。从 lambda@edge 到公共互联网的公开调用会带来延迟损失,因此我们理想情况下希望缓存数据。当然,我们可以使用 ElastiCache 或 DynamoDB 作为缓存层,但这会抵消在边缘位置运行 lambda 的好处,因为它需要与其中一个区域的资源进行通信。
我能想到的一种方法是将数据存储在启用了 CloudFront 分发的静态网站 S3 存储桶中。如果我理解正确的话,这意味着该文件也将出现在 CloudFront 上与 lambda 本身相同的边缘位置。然后,Lambda 可以调用静态网站并从边缘缓存中检索该文件。这是一个有效的模式吗?有更好的解决方案吗?
amazon-web-services amazon-cloudfront aws-lambda aws-lambda-edge
我想使用S3对象元数据和DB(或某些远程服务)中的一些角色数据来保护Cloudfront响应,这是当前用户的特定.我想我应该viewer-response在这里使用事件,以便一起访问S3数据和用户数据.我尝试设置status和statusDescription在response对象中,但它不适用于viewer-response事件,适用于所有其他事件.设置标题仍然有效.
exports.handler = async (event) => {
const response = event.Records[0].cf.response;
const request = event.Records[0].cf.request;
const isUserAllowed = await allowedByTokenAndDb(request);
const isS3ObjectAllowed = response.headers['x-amz-meta-isSecure'][0].value === 'true';
if (!isUserAllowed || !isS3ObjectAllowed) {
response.status = '403'; // does not work
response.statusDescription = 'Nothing';
}
response.headers['X-Powered-By'] = [{ // works, header will be added
key: 'X-Powered-By',
value: 'lol',
}]
return response;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让viewer-response返回另一个状态?AWS文档并未说明它是否可行.也许有另一种解决方案?
我们所做的是请求像“media/catalog/product/3/0/30123/768x/lorem.jpg”这样的图像,然后我们使用位于“media/catalog/product/3/0/”的原始图像30123.jpg”,如果浏览器支持,则将其调整为 768px 和 webp,然后返回新图像(如果尚未缓存)。
如果您要求:wysiwyg/lorem.jpg 它将尝试创建最大 1920 像素(无放大)的 webp。
这似乎在 <= 1420 像素宽的图像内工作得很好。然而上面我们只得到HTTP 502: The Lambda function returned invalid json: The json output is not parsable.
SO 上有一个与 GZIP 相关的类似问题,但是据我所知,您不应该真正使用 GZIP 图像:https : //webmasters.stackexchange.com/questions/8382/gzipped-images-is-it-worth/57590# 57590
但原始图像可能已经上传到 S3 GZIPPED。但是 gzip 可能会导致错误,因为为什么它适用于较小的图像呢?我们在 Cloudfront 中禁用了 GZIP。
我给了 Lamda@Edge Resize 函数最大资源 3GB 内存和 30 秒超时..这对于更大的图像还不够吗?
我已经删除了已经生成的图像,使 Cloudfront 无效,但它的行为仍然相同..
编辑:更新:
我只是尝试了一个不同的图像,然后它工作正常..我不知道为什么以及如何解决损坏的图像然后......我猜Cloudfront现在已经缓存了502..我已经使用“*”无效但没有没有帮助..两个原始文件都是jpg。
工作图像的原始源图像是 6.1 MB,如果重要的话,非工作图像是 6.7 MB。
他们有这些限制:https : //docs.aws.amazon.com/lambda/latest/dg/limits.html
response.body 停止工作时大约为 512 MB。
我正在尝试根据文章使用 cloudfront 发行版调整图像大小:https ://aws.amazon.com/tr/blogs/networking-and-content-delivery/resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn -博客/
我在文章中使用给定的 Origin-Response 和 Viewer-Request 函数创建了项目文件夹,并下载了依赖项,使用 cloudformation 模板部署了 zip 包。
IAM 角色、s3 存储桶、存储桶策略、带有 lambda@edge 函数的分发创建时没有任何错误,而且它们似乎都兼容。
但是当我尝试调整原始存储桶中的图像大小时出现以下错误;
“503 错误无法满足请求。与 CloudFront 分配关联的 Lambda 函数无效或没有所需的权限。”
我也没有看到任何关于监控的内容,这意味着我的功能没有被调用。
我创建了另一个具有“AdministratorAccess”策略和信任关系的管理员角色“edgelambda.amazonaws.com”、“lambda.amazonaws.com”
我将我的存储桶策略更改为所有公共。
我可以查看图像,但是当我尝试通过将查询字符串添加到 cloudfront 分发 url 来调整大小时仍然出现 503 错误
“xxxxxxxxx.net/images/pexels.jpeg?d=100x100”
这是我的存储桶、存储桶策略、IAM 角色和功能。
存储桶名称:image-resize-488052071209-us-east-1
Bukcet 政策:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::image-resize-488052071209-us-east-1/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::image-resize-488052071209-us-east-1/*"
},
{
"Effect": "Allow",
"Principal": …Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-web-services amazon-iam aws-lambda aws-lambda-edge
我想锁定我的 API,并且想知道执行此操作的最佳方法。
我有大约 20 个微服务,它们使用 API 网关和具有自定义授权者的代理。这有一个云前端分布。
通过授权令牌(承载)发送的问题是,我没有为每个新用户获得 Cloudfront 的缓存优势。因此,我会遭受两组冷启动,这使得云前端毫无意义。
我应该切换到 lambda@edge 授权方法还是应该继续使用自定义授权方。我想知道这两种方法的好处。有人担心,如果我们使用 lambda@edge 授权技术,那么我们就会让代理 API(非 Cloudfront)完全开放。
感谢您的帮助!
authorization amazon-web-services aws-api-gateway aws-lambda-edge