Amazon CloudWatch Internet Monitorのスタック更新が今までと少し違った

2023.06.27

こんにちは、シマです。

先日、以下の記事を書きました。

上記記事内でも記載していますが、AWS CloudFormationのユーザガイドにあったそれらしいページを参照してテンプレートを作成しました。そこで、見慣れないプロパティがあって、その利用方法が今までの感覚と違ったのでそこについて触れていきたいと思います。

伝えたいこと

例えば、Internet Monitorのモニタリング対象リソースが以下のように2つのVPCだったとします。 その時のテンプレートは以下のように記載しています。

  InternetMonitor:
    Type: AWS::InternetMonitor::Monitor
    Properties:
      MaxCityNetworksToMonitor: "100"
      MonitorName: "monitor-test"
      TrafficPercentageToMonitor: "100"
      Resources:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-xxxxxxxxxxxxxxxxx"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"

次にInternet Monitorのモニタリング対象リソースを以下のように増やしたいとします。 以下のように追加したいVPCのARNを追記してスタック更新をしても構成図にようになりません

  InternetMonitor:
    Type: AWS::InternetMonitor::Monitor
    Properties:
      MaxCityNetworksToMonitor: "100"
      MonitorName: "monitor-test"
      TrafficPercentageToMonitor: "100"
      Resources:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-xxxxxxxxxxxxxxxxx"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-zzzzzzzzzzzzzzzzz"

スタック更新後のモニタリング対象リソースは以下の通り追加されていません。

どうすれば良いのか

モニタリング対象リソースを追加する場合は「ResourcesToAdd」、削除する場合は「ResourcesToRemove」として追記します。感覚的にはSDKでコードを書いている感覚に近いです。

リソースを追加したい場合

  InternetMonitor:
    Type: AWS::InternetMonitor::Monitor
    Properties:
      MaxCityNetworksToMonitor: "100"
      MonitorName: "monitor-test"
      TrafficPercentageToMonitor: "100"
      Resources:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-xxxxxxxxxxxxxxxxx"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"
      ResourcesToAdd:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-zzzzzzzzzzzzzzzzz"

リソースを削除したい場合

  InternetMonitor:
    Type: AWS::InternetMonitor::Monitor
    Properties:
      MaxCityNetworksToMonitor: "100"
      MonitorName: "monitor-test"
      TrafficPercentageToMonitor: "100"
      Resources:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-xxxxxxxxxxxxxxxxx"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"
      ResourcesToRemove:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"

注意事項

2回目のスタック更新時には、前回更新に用いた「ResourcesToAdd」や「ResourcesToRemove」は再度実行されてしまうため、削除する必要があるということです。 例えば、モニタリング対象リソースを追加するために以下のテンプレートでスタック更新を行ったとします。

  InternetMonitor:
    Type: AWS::InternetMonitor::Monitor
    Properties:
      MaxCityNetworksToMonitor: "100"
      MonitorName: "monitor-test"
      TrafficPercentageToMonitor: "100"
      Resources:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-xxxxxxxxxxxxxxxxx"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"
      ResourcesToAdd:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-zzzzzzzzzzzzzzzzz"

その後、不要であると判明した「vpc-y」を削除する場合に以下のように追記してスタック更新をするとエラーになってしまいます。

  InternetMonitor:
    Type: AWS::InternetMonitor::Monitor
    Properties:
      MaxCityNetworksToMonitor: "100"
      MonitorName: "monitor-test"
      TrafficPercentageToMonitor: "100"
      Resources:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-xxxxxxxxxxxxxxxxx"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"
      ResourcesToAdd:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-zzzzzzzzzzzzzzzzz"
      ResourcesToRemove:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"

エラー内容から、前回実行していた「ResourcesToAdd」が今回のスタック更新処理に含まれていたことが推測されます。そのため、実際には以下のように修正してスタック更新をする必要があります。

  InternetMonitor:
    Type: AWS::InternetMonitor::Monitor
    Properties:
      MaxCityNetworksToMonitor: "100"
      MonitorName: "monitor-test"
      TrafficPercentageToMonitor: "100"
      Resources:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-xxxxxxxxxxxxxxxxx"
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"
      ResourcesToRemove:
        - !Sub "arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::AccountId}:vpc/vpc-yyyyyyyyyyyyyyyyy"

最後に

私が知らないだけで、他にも似たような挙動をするタイプが存在するかもしれませんが、見慣れない動作だったのでアウトプットしてみました。

本記事がどなたかのお役に立てれば幸いです。