1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cloudformationのインポート機能

Last updated at Posted at 2022-03-13

次の通りNLBをCloudformationで作成し、Codepipelineで実行していたとします。

cloudformation.yml
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  ElasticLoadBalancingV2LoadBalancer:
    Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
    Properties:
      Name: "import-nlb"
      Scheme: "internal"
      Type: "network"
      Subnets: 
      - "subnet-XXX"
      - "subnet-XXX"
      IpAddressType: "ipv4"
      LoadBalancerAttributes: 
      - 
        Key: "access_logs.s3.enabled"
        Value: "false"
      - 
        Key: "deletion_protection.enabled"
        Value: "false"
      - 
        Key: "load_balancing.cross_zone.enabled"
        Value: "false"

  ElasticLoadBalancingV2Listener:
    Type: "AWS::ElasticLoadBalancingV2::Listener"
    Properties:
      LoadBalancerArn: !Ref ElasticLoadBalancingV2LoadBalancer
      Port: 80
      Protocol: "TCP"
      DefaultActions: 
      - 
        Order: 1
        TargetGroupArn: !Ref ElasticLoadBalancingV2TargetGroup
        Type: "forward"

  ElasticLoadBalancingV2TargetGroup:
    Type: "AWS::ElasticLoadBalancingV2::TargetGroup"
    Properties:
      HealthCheckIntervalSeconds: 30
      Port: 80
      Protocol: "TCP"
      HealthCheckPort: "traffic-port"
      HealthCheckProtocol: "TCP"
      HealthCheckTimeoutSeconds: 10
      UnhealthyThresholdCount: 3
      TargetType: "ip"
      HealthyThresholdCount: 3
      VpcId: "vpc-XXX"
      Name: "import-tg"
      HealthCheckEnabled: true
      TargetGroupAttributes: 
      - 
        Key: "proxy_protocol_v2.enabled"
        Value: "false"
      - 
        Key: "preserve_client_ip.enabled"
        Value: "false"
      - 
        Key: "stickiness.enabled"
        Value: "false"
      - 
        Key: "deregistration_delay.timeout_seconds"
        Value: "300"
      - 
        Key: "stickiness.type"
        Value: "source_ip"
      - 
        Key: "deregistration_delay.connection_termination.enabled"
        Value: "false"

次に、コンソールからNLBリスナーをわざと削除してから、コンソールで再作成します。
スクリーンショット 2022-03-12 15.50.13.png

この場合、Cloudformationテンプレートとコンソールから再作成したものに差が出ることとなります。

次にCloudformationテンプレートのNLBリスナーのリソースをコメントアウトし、Codepipelineを実行してみます。

cloudformation.yml
#   ElasticLoadBalancingV2Listener:
#     Type: "AWS::ElasticLoadBalancingV2::Listener"
#     Properties:
#       LoadBalancerArn: !Ref ElasticLoadBalancingV2LoadBalancer
#       Port: 80
#       Protocol: "TCP"
#       DefaultActions: 
#       - 
#         Order: 1
#         TargetGroupArn: !Ref ElasticLoadBalancingV2TargetGroup
#         Type: "forward"

NLBリスナーはコンソールから再作成しているため、当然消えません。

スクリーンショット 2022-03-12 16.00.30.png

では、ここからが本題です。

コンソールから再作成したNLBリスナーをCloudformationのインポート機能を利用して、テンプレート化します。

なお、Cloudformationのインポートにリソースがサポートしている必要があるので注意しましょう。

Cloudformationのコンソールから作業します。
先程コメントアウトした箇所を解除したものと、DeletionPolicy: Retain を追加したCloudformationテンプレートを準備しておきます。

「スタックアクション」から、「スタックへのリソースのインポート」をクリック。
スクリーンショット 2022-03-12 16.11.09.png

「次へ」をクリック。
スクリーンショット 2022-03-12 16.11.38.png

「cloudformation.yml」をアップロードし、「次へ」をクリック。
スクリーンショット 2022-03-12 16.11.53.png

コンソールから再作成したNLBリスナーのarnを入力し、「次へ」。
スクリーンショット 2022-03-12 16.13.06.png

「次へ」。
スクリーンショット 2022-03-12 16.13.27.png

 コンソールから再作成したNLBリスナーのarnが指定されていることを確認し、「リソースをインポート」。
スクリーンショット 2022-03-12 16.13.43.png

「ドリフトの検出」後「ドリフト結果を表示」からCloudformationテンプレートに差がないか確認してみましょう。
スクリーンショット 2022-03-12 16.14.11.png
スクリーンショット 2022-03-12 16.14.23.png

NLBリスナーのリソースを確認し、「IN_SYNC」と差がないことが確認できました。
スクリーンショット 2022-03-12 16.14.47.png

次に、コメントアウトした箇所を解除したCloudformationテンプレートをCodepipelineから実行してみます。

ハマりどころ。。。

Cloudformationのイベントを確認すると、「IMPORT_COMPLETE」から変化しません。
スクリーンショット 2022-03-13 16.03.31.png

Codepipelineを停止して中止後、Cloudformationから直接スタックを更新してみます。
この時同じCloudformationテンプレートでは、次のようなエラーが表示されてしまうため、DeletionPolicy: Retainを外した状態でスタックを更新してみます。

この変更セットの作成中にエラーが発生しました The submitted information didn't contain changes. Submit different information to create a change set.

Cloudformationスタックのステータスが、「UPDATE_COMPLETE」となったことを確認します。

スクリーンショット 2022-03-13 16.14.21.png

この状態で、Codepipelineを再度実行してみます。今度はCodepipelineが最後まで完了したみたいです。

スクリーンショット 2022-03-13 16.28.21.png

Cloudformationスタックのステータスが「IMPORT_COMPLETE」では、Codepipelineから実行すると、変化しないということでしょうか?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?