在 CloudFormation 或 serverless.yml 中提供 OriginAccessIdentity 参考

Posted

技术标签:

【中文标题】在 CloudFormation 或 serverless.yml 中提供 OriginAccessIdentity 参考【英文标题】:Giving OriginAccessIdentity reference in CloudFormation or serverless.yml 【发布时间】:2019-07-09 17:04:35 【问题描述】:

我想要一个可以访问私有 S3 存储桶的 CloudFront 分配。为此,我必须创建一个原始访问身份。手动,我可以使用 AWS 控制台执行此操作,但我想通过 CloudFormation 脚本或无服务器(使用 serverless.yml)创建它。执行此操作时,我可以将原始访问身份的物理 ID 添加到我的 CloudFront 分配(使用一个脚本)。

相关文档:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-cloudfront.html

我试过了:

myDistribution:
  Type: AWS::CloudFront::Distribution
  Properties:
    DistributionConfig:
      Origins:
      - DomainName:bucket.s3.amazonaws.com
        Id: myS3Origin
        S3OriginConfig: 
          OriginAccessIdentity:origin-access-identity/cloudfront/ !Ref cloudfrontoriginaccessidentity
        
      Enabled: 'true'
      Comment: Some comment
      DefaultCacheBehavior:
        ForwardedValues:
          QueryString: 'false'
          Cookies:
            Forward: none
        AllowedMethods:
        - GET
        - HEAD
        - OPTIONS
        TargetOriginId: myS3Origin
        ViewerProtocolPolicy: redirect-to-https
      PriceClass: PriceClass_200
      ViewerCertificate:
        CloudFrontDefaultCertificate: 'true'
cloudfrontoriginaccessidentity:
  Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
  Properties:
    CloudFrontOriginAccessIdentityConfig:
      Comment: "some comment"

我必须创建一个原始访问身份和一个具有该身份的 CloudFront 分配。我们可以在一个 CloudFormation 脚本中或使用无服务器(使用 serverless.yml)来完成这两件事吗?

【问题讨论】:

你遇到了什么错误? @Alex 我收到“指定的源访问身份不存在或无效。(服务:AmazonCloudFront;状态代码:400;错误代码:InvalidOriginAccessIdentity;请求 ID:79f6a033-3202-11e9 -911d-0d536d188164)。”问题是,我们必须在 s3 原始配置下将原始访问身份提及为“OriginAccessIdentity:origin-access-identity/cloudfront/ETRATTARR”。但是当我们使用“!Ref cloudfrontoriginaccessidentity”时,我们只会得到 id ETRATTARR)。我想将该 id 附加到 "OriginAccessIdentity:origin-access-identity/' 【参考方案1】:

是的,您可以在同一个 CloudFormation 模板中创建两者。 cloudfrontoriginaccessidentity 是一个单独的资源,因此需要从myDistribution 下方移出。

myDistribution:
      Type: AWS::CloudFront::Distribution
      Properties:
        DistributionConfig:
          Origins:
          - DomainName:bucket.s3.amazonaws.com
            Id: myS3Origin
            S3OriginConfig: 
              OriginAccessIdentity:origin-access-identity/cloudfront/ !Ref cloudfrontoriginaccessidentity
            
          Enabled: 'true'
          Comment: Some comment
          DefaultCacheBehavior:
            ForwardedValues:
              QueryString: 'false'
              Cookies:
                Forward: none
            AllowedMethods:
            - GET
            - HEAD
            - OPTIONS
            TargetOriginId: myS3Origin
            ViewerProtocolPolicy: redirect-to-https
          PriceClass: PriceClass_200
          ViewerCertificate:
            CloudFrontDefaultCertificate: 'true'
cloudfrontoriginaccessidentity:
  Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
  Properties:
    CloudFrontOriginAccessIdentityConfig:
    Comment: "toyoguard-acces-identity"

【讨论】:

我收到“指定的源访问身份不存在或无效。(服务:AmazonCloudFront;状态代码:400;错误代码:InvalidOriginAccessIdentity;请求 ID:79f6a033-3202-11e9-911d -0d536d188164)。”问题是,我们必须在 s3 原始配置下将原始访问身份提及为“OriginAccessIdentity:origin-access-identity/cloudfront/ETRATTARR”。但是当我们使用“!Ref cloudfrontoriginaccessidentity”时,我们只会得到 id ETRATTARR)。我想将该 id 附加到 "OriginAccessIdentity:origin-access-identity 这不是答案,只是原始问题的格式有问题。【参考方案2】:

您绝对可以在同一个serverless.yml 中创建源访问身份和 CloudFront 分配。

我已修改您的方案并将OriginAccessIdentity 更改为使用Fn::Join

myDistribution:
  Type: AWS::CloudFront::Distribution
  Properties:
    DistributionConfig:
      Origins:
      - DomainName:bucket.s3.amazonaws.com
        Id: myS3Origin
        S3OriginConfig:
          OriginAccessIdentity:
            Fn::Join:
              - ''
              -
                - 'origin-access-identity/cloudfront/'
                - Ref: cloudfrontoriginaccessidentity
      Enabled: 'true'
      Comment: Some comment
      DefaultCacheBehavior:
        ForwardedValues:
          QueryString: 'false'
          Cookies:
            Forward: none
        AllowedMethods:
        - GET
        - HEAD
        - OPTIONS
        TargetOriginId: myS3Origin
        ViewerProtocolPolicy: redirect-to-https
      PriceClass: PriceClass_200
      ViewerCertificate:
        CloudFrontDefaultCertificate: 'true'

cloudfrontoriginaccessidentity:
  Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
  Properties:
    CloudFrontOriginAccessIdentityConfig:
      Comment: "some comment"

无服务器示例存储库也有一个很好的例子:https://github.com/serverless/examples/blob/master/aws-node-single-page-app-via-cloudfront/serverless.yml

【讨论】:

【参考方案3】:

不要忘记将 s3 策略和存储桶添加到您的依赖列表中

【讨论】:

以上是关于在 CloudFormation 或 serverless.yml 中提供 OriginAccessIdentity 参考的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS SAM 或 Cloudformation 中添加身份提供者

如何使用 cloudformation 或 yaml 将保留天数设置为日志流

用于管理 AWS 无服务器基础设施的 Terraform 或 cloudformation [关闭]

异步 Lambda 函数:返回 promise 或发送 responseURL 不会终止 CloudFormation 自定义资源调用

AWS Cloudformation-如何在 json/yaml 模板中处理字符串大写或小写

dynamoDB 的 CloudFormation 模板不起作用:一个或多个参数无效