6

API を保護するために、RateBasedRule を使用して WAFRegional をデプロイしようとしています。API ゲートウェイは SAM テンプレートにあり、WAFRegional 構成を保持する子テンプレート用のネストされたスタックもあります。WAFRegional 構成の子テンプレートを以下に示します。ExecuteChangeSet フェーズで行われる処理は次のとおりです。

  1. CamerasIpSet が作成されました

  2. CamerasRateRule が作成されました

  3. WAFCamerasWebACL CREATE_FAILED: 参照されたアイテムが存在しません。(サービス: AWSWAFRegional; ステータス コード: 400; エラー コード: WAFNonexistentItemException

サーバーレスを使用しているときに誰かが同じ問題を抱えている約 2 か月前の次の投稿を見つけました: https://forum.serverless.com/t/dependon-api-gateway-deployment/7792

ここで何が欠けていますか?

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Template for WAF Configuration'
Parameters:
  CamerasApi:
    Description: "Arn of the Cameras Api"
    Type: String
    Default: cameras-api-dev
  StageName:
    Description: "Stage name of the Cameras Api"
    Type: String
    Default: v
  Blocking:
    Description: "Number of calls per 5 minutes for WAF IP blocking."
    Type: Number
    Default: 2000
  EnvironmentType:
    Type: String
    Default: "dev"
    Description: "Type of environment: dev, staging or prod."


Resources:
  WAFCamerasWebACL:
    Type: AWS::WAFRegional::WebACL
    DependsOn: CamerasRateRule
    Properties:
      DefaultAction:
        Type: ALLOW
      MetricName: !Join ['', ['IPBlockingMetric', !Ref EnvironmentType]]
      Name: !Join ['', ['IPBlockingACL', !Ref EnvironmentType]]
      Rules:
        -
          Action:
            Type: "BLOCK"
          Priority: 1
          RuleId: !Ref CamerasRateRule

  CamerasRateRule:
    Type: AWS::WAFRegional::RateBasedRule
    Properties:
      MetricName: UnallowedAccessCount
      Name: FiveMinuteRule
      RateKey: IP
      RateLimit: !Ref Blocking
      MatchPredicates:
      -
        DataId: !Ref CamerasIpSet
        Negated: false
        Type: "IPMatch"

  CamerasIpSet:
    Type: AWS::WAFRegional::IPSet
    Properties:
      Name: !Join ['-', ['IpBlacklist', !Ref EnvironmentType]]


  MyWebACLAssociation:
    Type: AWS::WAFRegional::WebACLAssociation
    Properties:
      ResourceArn: !Sub arn:aws:apigateway:${AWS::Region}::/restapis/${CamerasApi}/stages/${StageName}
      WebACLId: !Ref WAFCamerasWebACL

Outputs:
  WebACL:
    Description: Name of the web ACL
    Value: !Ref WAFCamerasWebACL


4

4 に答える 4

0

と が Cloudformation スタックで定義されていると仮定するAWS::WAFRegional::WebACLAWS::WAFRegional::RateBasedRule、次の bash スクリプトを使用してアタッチできます。

CHANGE_TOKEN=$(aws waf-regional get-change-token --output text)
WEBACL_ID=$(aws waf-regional list-web-acls --query WebACLs[0].WebACLId --output text)
RULE_ID=$(aws waf-regional list-rate-based-rules --query Rules[0].RuleId --output text)
aws waf-regional update-web-acl --web-acl-id $WEBACL_ID --change-token $CHANGE_TOKEN \
    --updates Action="INSERT",ActivatedRule='{Priority=1,RuleId="'$RULE_ID'",Action={Type="BLOCK"},Type="RATE_BASED"}'

ただし、残念ながら、これは Cloudformation スタックを削除するときに問題を引き起こします

次のリソースを削除できませんでした: [RateBasedRuleName]。

発行時にスタックがルールを削除できるようにする方法はありますaws cloudformation delete-stackか?

于 2019-07-30T17:46:36.900 に答える