[AWS][Cloudformation] Cloudformation之Nest stack

前言

最近需要把專案IaC化
而主要都是用AWS的那套
於是就理所當然的使用了Cloudformation

有留一些自己寫的sample,以後又要用可以改一改馬上用

Github連結
Cloudformation

緣由 – Stack之間的參數沿用

由於在做CI&CD流程,需要切3個一模一樣的環境(Dev、Lab、Prod),而官方也建議不要把全部的Service寫在同一個Template裡面,因此就會產生許多Stack…。

而目前我負責的專案,光是一個環境就產生了10個左右的Stack,而Stack會產生一些Export參數,要給其他Stack使用,但寫到後面,就可能像下面這個樣子要產生一堆Export只是為了給某1個Stack使用

SecurityGroup

Outputs:
  EC2SecurityGroup:
    Description: EC2 Security Group ID
    Value: !Ref EC2SecurityGroup
    Export:
      Name: !Sub '${AWS::StackName}-EC2SecurityGroupId'
  MqttSecurityGroupId:
    Description: MqttSecurityGroup ID
    Value: !Ref MqttSecurityGroup
    Export:
      Name: !Sub '${AWS::StackName}-MqttSecurityGroupId'
  RdsSecurityGroupId:
    Description: RDS SecurityGroup ID
    Value: !Ref RdsSecurityGroup
    Export:
      Name: !Sub '${AWS::StackName}-RdsSecurityGroupId'

LoadBalancer

  WebELBLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Subnets:
        - Fn::ImportValue: !Sub '${ParentStackName}-VPC-PublicSubnet1Id'
        - Fn::ImportValue: !Sub '${ParentStackName}-VPC-PublicSubnet2Id'
      SecurityGroups:
        - Fn::ImportValue: !Sub '${ParentStackName}-SG-EC2SecurityGroupId'
      LoadBalancerAttributes:
        - Key: idle_timeout.timeout_seconds
          Value: '60'
      Tags:
        - Key: Name
          Value: !Sub '${AWS::StackName}-WebELB'

只為了給LoadBalancer使用SecurityGroup的參數,就需要Export一堆參數,寫在一起又會讓Template過於肥胖,有沒有個可以拆解的好方法,不要太多Export參數。

解決方式

使用 Nest stack (官方文件)

Nest stack,簡單來講,就是在一個Template塞很多個Stack。

非常抽象對不對?

直接看下面的範例


Resources:
  Template1:
    Type: AWS::CloudFormation::Stack
    Properties:
      Parameters:
        參數Key1: 參數Value1
        參數Key2: !Ref Template1.outputvalue
      TemplateURL: 'Template1的放置網址'
      TimeoutInMinutes: '1'
  Template2:
    Type: AWS::CloudFormation::Stack
    Properties:
      Parameters:
        參數Key1: 參數Value1
        參數Key2: !Ref Template1.outputvalue
      TemplateURL: 'Template2的放置網址'
      TimeoutInMinutes: '1'
  Template3:
    Type: AWS::CloudFormation::Stack
    Properties:
      Parameters:
        參數Key1: 參數Value1
        參數Key2: !Ref Template1.outputvalue
      TemplateURL: 'Template3的放置網址'
      TimeoutInMinutes: '1'

沒錯,就是把一堆你預期相依性比較高的Stack,直接宣告Type叫Stack放在同一份Template即可,每份Template又可以獨立出來管理,參數又可以互相使用。

這樣讓Template之間可以有效的切分,又不會過於分散及肥胖。

注意事項

  1. Nest stack有一個缺點,你沒辦法只針對裡面某個Stack做刪除的動作,要刪除就是全部要一起刪除。

從官方網站這張圖就一目了然了。

  1. 注意每個Service是否真的需要Export value,需要的話還是要Export你要的值出來,才可以讓AWS SDK去使用你的Export參數,最重要還是要看你的設計架構相依性。

小結

之後會在新增其他有關Cloudformation使用到的一些技巧,僅做紀錄,不然看AWS文件那個坑洞…,恩,還是自己寫起來比較好。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *