标签: amazon-cloudfront

签名 URL 出现 CloudFront“MalformedPolicy”错误

我需要使用 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)

php amazon-cloudfront aws-sdk aws-access-policy

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

针对查看器请求和查看器响应的单个 Lambda@Edge 函数调用

我目前有两个 Lambda@Edge 函数:

  • language-redirect:根据查看器请求调用,返回 302 或将请求传递到 CloudFront
  • HSTS:在查看器响应时调用,添加响应标头

目前的流量为:

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)

目标是同一函数被调用一次,而不是同一函数被调用两次。

amazon-web-services amazon-cloudfront aws-lambda-edge

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

AWS CloudFront:缓存特定对象

我有一个具有以下配置的 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)

caching amazon-web-services amazon-cloudfront

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

Lambda@edge 不是由原始请求事件触发的

我正在尝试使用 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)

amazon-cloudfront aws-lambda-edge

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

Angular Routes 不适用于 cloudfront + s3

目前,我在 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。

在此处输入图片说明

我感谢任何帮助!

amazon-s3 amazon-cloudfront angular

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

AWS cloudfront 在不使用 Lambda@Edge 的情况下添加自定义标头

我想将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 面板?

amazon-s3 custom-headers amazon-cloudfront

1
推荐指数
3
解决办法
4820
查看次数

是否可以从 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 上禁用某些特定密码?

security amazon-web-services amazon-cloudfront

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

Cloudfront createInvalidation 随机不会从 Lambda 中触发

我在从 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 代码来看,我可能遗漏了什么吗?

谢谢。

amazon-s3 amazon-cloudfront aws-lambda aws-sdk-js

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

AWS:使用 CloudFront 处理 API 请求而不是直接将其路由到 ALB 有何意义?

我有一个负载均衡器 (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 提供静态文件是否有任何缺点?

amazon-s3 amazon-web-services amazon-cloudfront amazon-alb

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

如何确保 CloudFront 从我的 Elastic Beanstalk REST API 应用程序返回 cookie

我有一个用于部署在 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 中打开什么设置才能启用此功能?

cookies amazon-cloudfront amazon-elastic-beanstalk

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