0

简而言之,我试图完成的是以下内容:

  • 我想创建一个 WAF 条件/规则组合来阻止不在国家白名单中的流量。
  • 我想使用 CloudFormation,以便可以对其进行版本控制并轻松部署到不同的环境。
  • 我想将它与现有的 CloudFront 分配相关联(这是环境之间的不同之处)。理想情况下,无需重建 CloudFront 分配。

这似乎很简单,可以在 Web 控制台中设置,但 CloudFormation API 似乎更受限制?

我能够获得“WAFRegional” GeoMatchSetRule并且WebACL部署良好。然后,当尝试将其与现有的 CloudFront 分配相关联时,似乎我想要使用的不是“WAFRegional”类型,而只是“WAF”类型。但是没有GeoMatchSet“WAF”的API?

AWSTemplateFormatVersion: 2010-09-09
Resources:
  # Match Sets
  GeoMatchSetWhitelist:
    Type: "AWS::WAFRegional::GeoMatchSet"
    Properties:
      Name: "GeoMatchSet for whitelist countries"
      GeoMatchConstraints:
        -
          Type: "Country"
          Value: "CA"
        -
          Type: "Country"
          Value: "US"
  ByteMatchSetLoginURIs:
    Type: "AWS::WAFRegional::ByteMatchSet"
    Properties:
      Name: "ByteMatchSet for Login URIs"
      ByteMatchTuples:
        -
          FieldToMatch:
            Type: "URI"
          TargetString: "/my/uri"
          TextTransformation: "NONE"
          PositionalConstraint: "EXACTLY"

  # Rules
  WhitelistRule:
    Type: "AWS::WAFRegional::Rule"
    Properties:
      Name: "WhitelistRule"
      MetricName: "WhitelistRule"
      Predicates:
        -
          DataId:
            Ref: "GeoMatchSetWhitelist"
          # True here means match everying NOT in this match set
          Negated: true
          Type: "GeoMatch"
        -
          DataId:
            Ref: "ByteMatchSetLoginURIs"
          Negated: false
          Type: "ByteMatch"

  # Web Access Control Lists
  WebACL:
    Type: "AWS::WAFRegional::WebACL"
    Properties:
      Name: "WhitelistWebACL"
      DefaultAction:
        Type: "ALLOW"
      MetricName: "WebACL"
      Rules:
        -
          Action:
            Type: "BLOCK"
          Priority: 2
          RuleId:
            Ref: "WhitelistRule"

  # Web ACL Association
  WebACLAssociation:
    Type: "AWS::WAF::WebACLAssociation"
    Properties:
      ResourceArn:
        Ref: "arn:aws:cloudfront::999999999999:distribution/AAAAAAAAAAAA"
      WebACLId:
        Ref: "WebACL"

运行上面的代码给了我错误An error occurred (ValidationError) when calling the CreateChangeSet operation: Template format error: Unresolved resource dependencies [arn:aws:cloudfront::999999999999:distribution/AAAAAAAAAAAA] in the Resources block of the template

最后,是否可以使用带有 、 和现有 CloudFront 分配的 CloudFormation 来构建GeoMatchSetByteMatchSet

4

1 回答 1

0

上次我检查时,CloudFormation 对 GeoMatchSet 的支持确实存在于区域但不存在于全球 (CloudFront)。不幸的是,CloudFormation 以功能支持的大杂烩而闻名,尽管它正在慢慢变得更好......

于 2019-07-26T23:47:24.813 回答