我需要使用 PHP 使用自定义策略创建签名的 CloudFront URL,但无论我做什么,显然我的策略都是“格式错误”。以下是该函数中生成的策略示例:
{"Statement":{"Resource":"https://d15xojelh58w5d.cloudfront.net/memo/kwz/cvyhkfdqn5oz0z1dz5at4z4s1jsn.kwz","Condition":{"DateLessThan":{"AWS:EpochTime":1490463203},"IpAddress":{"AWS:SourceIp":"1.2.3.4/32"}}}}
Run Code Online (Sandbox Code Playgroud)
生成的网址:
https://d15xojelh58w5d.cloudfront.net/memo/kwz/cvyhkfdqn5oz0z1dz5at4z4s1jsn.kwz?Policy=eyJTdGF0ZW1lbnQiOnsiUmVzb3VyY2UiOiJodHRwczovL2QxNXhvamVsaDU4dzVkLmNsb3VkZnJvbnQubmV0L21lbW8va3d6L2N2eWhrZmRxbjVvejB6MWR6NWF0NHo0czFqc24ua3d6IiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNDkwNDYzMjAzfSwiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjEuMi4zLjQvMzIifX19fQ__&Signature=MmBPtpipFLuNwaPliGLJajG4gJ7INwD0ptFdxPFYQP9CT-luq6W0SrAs9O9CqbJPHoukXwDzG~c88Rr5I2I9KP5QwD8MHpogGh~3SM3gBYm8ao0Zm7a5C9tWnBVRCtzuGrCrFstK-qLswWmqo6tNiOynSuFpvm9uDe3C8oWE2RzSZavEXoL35D3F8y98NeM0aOJe37EeSpdz3lrZZxei2TugoO-OmnApXa2YYJR2HiQ2l0t8paxcb3xyhCK1c1AR51uOpWLm63k~d0eNZJGo3x0Y6bx0GBqafdvV6jiUv6PbhiMC1ZcTxGnZhLmsz3~ONsEvaR1jyyOPt6y9Nos8yA__&Key-Pair-Id=APKAJ6RV6ACUX5M5IAOQ
Run Code Online (Sandbox Code Playgroud)
代码:
function cloudfront_sign($url, $expiry = null, $ipLock = true) {
$policy = array(
'Statement' => array(
'Resource' => $url,
'Condition' => array(),
),
);
if(!$expiry || $expiry <= time()) $expiry = 2147483647; // CloudFront *requires* an expiry date, so set to 03:14:07 UTC on Tuesday, 19 January 2038 if one is not provided
$policy['Statement']['Condition']['DateLessThan'] = array('AWS:EpochTime' => $expiry);
if($ipLock) $policy['Statement']['Condition']['IpAddress'] = array('AWS:SourceIp' => $_SERVER['REMOTE_ADDR'].'/32');
$signer = new Aws\CloudFront\UrlSigner($_config['keyID'], $_config['keyPath']);
$jsonPolicy = json_encode($policy, …Run Code Online (Sandbox Code Playgroud) 我目前有两个 Lambda@Edge 函数:
目前的流量为:
viewer request -> language-redirect
if 302 -> viewer response
if not 302 -> pass on to CloudFront -> HSTS -> viewer response
Run Code Online (Sandbox Code Playgroud)
是否可以将这两个功能组合到一个函数(组合)中,每个查看器请求仅调用一次?
viewer request -> combined
if 302 -> viewer response
if not 302 -> pass on to CloudFront -> combined -> viewer response
Run Code Online (Sandbox Code Playgroud)
目标是同一函数被调用一次,而不是同一函数被调用两次。
我有一个具有以下配置的 CDN (CloudFront) 发行版。(我使用签名cookie,但我不认为它是相关的):
DefaultCacheBehavior:
# Target the origin
TargetOriginId: !Sub 'S3-${ProjectName}-${Environment}'
ViewerProtocolPolicy: redirect-to-https
# Check always the origin (in this case S3) for the item so always the newest item is served.
MinTTL: 0
DefaultTTL: 0
MaxTTL: 0
AllowedMethods:
- HEAD
- GET
- OPTIONS
CachedMethods:
- HEAD
- GET
- OPTIONS
ForwardedValues:
QueryString: true
Cookies:
Forward: all
# Specifies the AWS account(s) that you want to allow to create signed URLs or signed cookies for private content.
TrustedSigners: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 CloudFormation 配置 Lambda@edge 函数。部署模板后,一切都可以在控制台中找到,但是监听origin-request事件的 lambda 函数没有被触发。奇怪的是,一个viewer-request事件确实设法触发了一个功能。
我究竟做错了什么?我怎样才能让origin-request活动发挥作用?
这是我的模板:
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: Deployment of Lambda@edge functions
Parameters:
Stage:
Type: String
AllowedValues:
- staging
- production
Default: staging
Description: Stage that can be added to resource names
CodeBucket:
Type: String
Description: The S3 Bucket name for latest code upload
CodeKey:
Type: String
Description: The S3 Key for latest code upload
# Mappings:
# AliasMap:
# staging:
# Alias: "staging-app.achrafsouk.com"
# production:
# Alias: …Run Code Online (Sandbox Code Playgroud) 目前,我在 cloudfront 中的应用程序仅加载了应用程序启动时的默认路由。当我cloudfront.[address].net 使用 WAF 访问站点根目录时,它可以使用我也使用 WAF 将其限制为仅我的 IP 地址,但是当我转到 cloudfront.[address].net/signup 或 /login 时,我得到
我怎样才能让子路线也起作用?我有我的存储桶策略
桶策略
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "3",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E2SRF18SRG0FC7"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[bucket]/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我阻止了所有公共访问,但我也在使用带有 OAI 的 cloudfront,所以我认为我不需要担心它会被阻止,因为它正在通过 cloudfront。
我感谢任何帮助!
我想将x-frame-options作为同源添加到在S3存储桶上为我的应用程序提供服务的AWS CloudFront服务。
我不想添加新的Lambda函数来编辑请求标头。
其实我在附件中找到了一个地方:
CloudFront Distributions -> My Distribution settings -> Origins and Origin Groups -> S3 Content item that代表我的应用程序 -> add Origin Custom Headers -> Header name: x-frame-options , Value : sameorigin
但是当部署完成时,仍然在 S3 存储桶文件和 URL 的所有相关请求中获取旧标头。
我如何在没有任何 Lambda 函数的情况下添加到标头,而只是直接使用现有的 AWS CloudFront 面板?
我正在使用一个工具进行安全检查,这个工具将以下密码标记为弱:
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003C)
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xC027)
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xC028)
Run Code Online (Sandbox Code Playgroud)
我正在使用最新的 CloudFront 安全策略,即 TLSv1.2_2018 和设置为 TLSv1.2 的最小源 SSL 协议。
但即使有这些设置,仍然允许使用弱密码。
是否可以在 CloudFront 上禁用某些特定密码?
我在从 AWS Lambda 创建 Cloudfront 失效时遇到问题。
我的情况非常基本:我设置了一个由特定 S3 对象创建和删除触发的 Lambda 处理程序,以便在我的 Cloudfront 发行版上执行缓存版本的失效操作。这是使用nodejs编写的函数代码:
const AWS = require('aws-sdk');
exports.handler = async function (event, context) {
const cloudFront = new AWS.CloudFront();
const invalidationParams = {
DistributionId: "XXXX",
InvalidationBatch: {
CallerReference: Date.now().toString(),
Paths: {
Quantity: 2,
Items: [
"/index.html",
"/service-worker.js"
]
}
}
};
cloudFront.createInvalidation(invalidationParams, (error, data) => {
if (error) {
console.log(error, error.stack);
} else {
console.log("Invalidation results", data);
}
});
};
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,没有什么太复杂的。现在,大多数时候处理程序执行时不执行任何操作,我会查看日志,除了请求 id 以及开始和结束时间戳之外,没有任何内容被打印,甚至没有 Cloudfront 错误,这让我想知道发生了什么。连续执行四到五次手动测试后,会正确创建失效,但日志不会报告它。再触发一次,然后打印上一次运行的失效结果。我觉得这非常奇怪和令人困惑。
从上下文和 Lambda 代码来看,我可能遗漏了什么吗?
谢谢。
我有一个负载均衡器 (ALB) 正在处理我的应用程序的 API 请求 (alb.domain.com) 。我还有一个 S3 存储桶,我的静态站点通过 CloudFront (domain.com) 提供服务。我已经配置了一个发行版,以便 /api 转到 ALB,其余部分转到 S3,一切正常。不过,我也可以将 API 请求直接路由到 ALB (alb.domain.com/api),而不是将 API 请求路由到 CloudFront (domain.com/api),这也可以正常工作。我不需要缓存我的 API 请求,所以我无论如何都在发行版上禁用了它。鉴于我 (1) 在路由中引入额外的连接以及 (2) 现在根据 CloudFront 定价计算我的请求,那么我通过 CloudFront 执行请求的意义何在。仅将请求直接路由到 ALB 并仅使用 CloudFront 提供静态文件是否有任何缺点?
我有一个用于部署在 AWS Elastic Beanstalk 中的 REST API 的 Java Spring Boot 应用程序。它是 HTTP 而不是 HTTPS。
我们就这样称呼它吧http://foobar.elasticbeanstalk.com/api。
我正在使用 AWS CloudFront 发行版来终止 HTTPS,但不缓存任何内容(我已将缓存策略设置为“Managed-CachingDisabled”。
我们就这样称呼它吧https://dfoobar123.cloudfront.net。
有些 API 需要客户端“登录”。有一个调用/login会导致响应 cookie 中返回 ACCESS_TOKEN。后续调用必须包含该访问令牌才能成功。
直接上app就OK了。当我访问http://foobar.elasticbeanstalk.com/api/login(直接使用 Elastic Beanstalk 应用程序)时,服务器会让我登录并返回 cookie。
但是,当我转到 CloudFrontDistribution https://dfoobar123.cloudfront.net/api/login时,我可以看到服务器对我进行身份验证,但我没有在响应标头中取回 cookie。
我需要在 CloudFront 中打开什么设置才能启用此功能?
amazon-s3 ×4
amazon-alb ×1
angular ×1
aws-lambda ×1
aws-sdk ×1
aws-sdk-js ×1
caching ×1
cookies ×1
php ×1
security ×1