home

Cloud formation

  • AWS에서 제공하는 Infra as Code
  • AWS 리소스를 코드로 정의하고 관리할 수 있는 서비스

구성 요소

  • Template: Json 또는 Yaml로 AWS소스를 정의, 리소스, 파라미터, outfut 등이 포함
  • stack: 스택은 템플릿 기반으로 생성된 AWS 리소스 집합, 해당 스택을 업데이트하거나 삭제 가능
  • parameter: 템플릿에 값을 동적으로 전달
  • output: 스택이 생성한 리소스의 중요한 정보를 반환
  • 그외 조건, 매핑이 존재

실전 예시

AWSTemplateFormatVersion: '2010-09-09'
Description: 예시 서버 템플릿

Parameters:
    EC2InstanceType:
        Type: String
        Default: t2.micro
        Description: EC2 Instance Type
    ...

Resources:
  EC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: !Ref EC2InstanceType
      ImageId: !Ref AMIId
      IamInstanceProfile: !Ref IAMInstanceProfile
      SecurityGroupIds:
        - !Ref SecurityGroup
      SubnetId: !Ref SubnetId1
      Tags:
        - Key: Name
          Value: !Ref InstanceName
    TargetGroup:
    Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
        Properties:
        Name: !Ref InstanceName
        TargetType: instance
        Protocol: HTTP
        Port: 80
        VpcId: !Ref VPCId
        HealthCheckProtocol: HTTP
        HealthCheckPort: 80
        HealthCheckPath: /
        Matcher:
            HttpCode: 200
        Targets:
            - Id: !Ref EC2Instance
            Port: 80
        DependsOn: EC2Instance
    LoadBalancer:
        Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
        Properties:
        Name: !Ref InstanceName
        Scheme: internet-facing
        Subnets:
            - !Ref SubnetId1
            - !Ref SubnetId2
            - !Ref SubnetId3
            - !Ref SubnetId4
        SecurityGroups:
            - !Ref SecurityGroup
        DependsOn: TargetGroup

  HttpListener:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref TargetGroup
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
    DependsOn: LoadBalancer
  • Parameters에 변수를 담는다. 한 칸 들여써서 변수를 할당한다.
  • Resource에 실제 리소스를 담는다. Type, Properties 순이다.
  • !Ref로 파라미터의 값이나 템플릿을 통해 만들어진 리소스를 변수처럼 사용할 수 있다.
    • !Ref는 간편한 점이 리소스의 기본 식별자(주로 리소스의 ID)를 반환한다.
    • 하지만 lister의 경우 LoadBalancerArn: !Ref myLoadBalancer의 경우 Arn을 반환한다. SSM같은 경우는 직접 파라미터 이름을 반환하거나 SNS의 경우에도 주제의 ARN을 반환한다. 만들 때 공식문서를 잘 참고해야겠다.
  • !Sub는 템플릿에서 문자열 내에서 변수를 대체하거나, 복잡한 문자열 조합을 만들 때 사용
    • 단순 문자열 대체에서는 ${} 구문을 사용
    • !Sub | 을 통해 json을 만들거나 복잡한 매개변수를 대체한다.
  • Fn::GetAtt는 특정 리소스의 속성 값을 가져오는데 사용된다.
  • Fn::Base64는 함수의 입력 문자열의 Base64 표시를 반환한다.

      UserData: !Base64 |
                  #! /bin/bash
                  yum update
                  yum install git
                  yum install ansible