본문 바로가기

AWS

AWS - CloudFormation EC2 사용자 정의 데이터

728x90

■ EC2 사용자 정의 데이터 - Manually 

  • EC2 인스턴스 생성 과정에서 bash shell을 이용한 업무 필요 시 템플릿에 사용자 데이터 정의 항목을 정의하여 구현 할 수 있습니다. 
  • 사용자 정의 데이터를 입력할 때 내장함수 Fn::Base64를 사용하고 | (파이프)를 붙입니다. | (파이프)의 기능 여러줄로 이루어진 문자열을 줄바꿈을 포함하여 문자열을 받아오고,  Base64는 해당 스크립트를 Base64 문자열로 변환을 의미 합니다. 
  • 사용자 데이터 스크립트는 로그가 남게 되며, 경로는 /var/log/cloud-init-output.log 에 기록 됩니다. 
    Resources:
      MyInstance:
        Type: AWS::EC2::Instance
        Properties:
          ImageId: ami-12345678
          InstanceType: t2.micro
          UserData:
            Fn::Base64: |
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              echo "Hello World Bro~" >> /var/www/html/index.html​
     

 

■ EC2 사용자 정의 데이터 - cfn-init

  • cfn-init 헬퍼 스크립트는 AWS::CloudFormation::Init 키에서 템플릿 메타데이터를 읽고 이에 따라 다음과 같이 동작합니다.
  • 사용자 정의 데이터를 수동으로 입력하는 방법보다 가독성이 높으며, cfn-init 외 다른 스크립트를 활용하여 대기 조건을 지정할 수 있습니다. 
  • 참조: cfn-init - AWS CloudFormation (amazon.com)
Resources: 
  MyInstance: 
    Type: AWS::EC2::Instance
    Metadata: 
      AWS::CloudFormation::Init: 
        config: 
          packages: 
          # 사전 패키징된 애플리케이션 및 구성 요소를 다운로드 및 설치
          # apt, msi, python, rpm, rubygems, yum 및 Zypper 패키지 형식을 지원
          # yum:
          #  httpd: []
          #  php: []
          #  wordpress: []   []는 최신버전, [x.y.z 지정하면 특정 버전 설치]
            :
          groups: 
          # groups 키를 사용하여 Linux/UNIX 그룹을 생성하고 그룹 ID를 할당할 수 있습니다. groups 키는 Windows 시스템에는 지원되지 않습니다.
            :
          users: 
          # users 키를 사용하여 EC2 인스턴스에서 Linux/UNIX 사용자를 생성할 수 있습니다. users 키는 Windows 시스템에는 지원되지 않습니다.
            :
          sources: 
          # 아카이브 파일을 다운로드한 후 EC2 인스턴스의 대상 디렉터리에 압축을 풉니다
            :
          files: 
          # EC2 인스턴스에서 파일을 생성할 수 있습니다.
            :
          commands: 
          #command 키를 사용하여 EC2 인스턴스에서 명령을 실행할 수 있습니다. 명령은 이름별 영문자 순으로 처리됩니다.
            :
          services: 
          # 인스턴스가 실행될 때 활성화되거나 비활성화될 서비스를 정의 합니다.
          # Linux 시스템에서 이 키는 sysvinit 또는 systemd를 사용하여 지원 합니다.
            :
    Properties: 
      :

 

# 사용 예제 

UserData 부분의 /opt/aws/bin/cfn-init 명령을 사용하여 CloudFormation Init를 실행하여 Metadata에 정의된 내용이 실행 됩니다. 

AWSTemplateFormatVersion: 2010-09-09

Resources:
  MyInstance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: t2.micro
      ImageId: ami-081a36454cdf357cb
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          DeleteOnTermination: true
          SubnetId: !Ref MySubnet
          GroupSet:
            - !Ref MySecurityGroup1
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash 
            yum install -y aws-cfn-bootstrap 
            /opt/aws/bin/cfn-init -s ${AWS::StackId} -r MyInstance --region ${AWS::Region}

    Metadata:
      Comment: Install HTTP Package
      'AWS::CloudFormation::Init':
        config:
          packages:
            yum:
              httpd: []
          files:
            "/var/www/html/index.html":
              content: |
                Hello world!
              mode: 000644
              owner: root
              group: root
        services:
          sysvinit:
            httpd:
              enabled: true
              ensureRunning: true

 

■ EC2 사용자 정의 데이터 - cfn-signal

  • cfn-signal 헬퍼 스크립트는 Amazon EC2 인스턴스가 성공적으로 생성 또는 업데이트되었는지 여부를 나타내도록 CloudFormation에 신호를 보냅니다
  • cfn-signal 스크립트는 cfn-init 직후에 실행되며, 작업 결과를 바탕으로 진행 및 실패 여부를 CloudFormation에게 전달 합니다.  
  • WaitCondition을 정의하여 cfn-signal로 부터 신호를 받을 때 까지 템플릿을 진행 시키지 않고 대기 합니다.
  • CreationPolicy  속성을 리소스와 연결하여 CloudFormation에서 지정된 수의 성공 신호를 수신하거나 제한 시간이 초과될 때까지 리소스의 상태가 생성 완료가 되지 않도록 방지합니다. (EC2와 Auto-Scaling Group 에서 사용 합니다)
  • 참조: cfn-signal - AWS CloudFormation (amazon.com)
AWSTemplateFormatVersion: 2010-09-09

Resources:
  MyInstance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: t2.micro
      ImageId: ami-081a36454cdf357cb
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          DeleteOnTermination: true
          SubnetId: !Ref MySubnet
          GroupSet:
            - !Ref MySecurityGroup1
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash 
            yum install -y aws-cfn-bootstrap 
            /opt/aws/bin/cfn-init -s ${AWS::StackId} -r MyInstance --region ${AWS::Region}
            /opt/aws/bin/cfn-signal -e $?  -stack ${AWS::StackId} --resource SampleWaitCondition --region ${AWS::Region}
            # $? 의미는 바로 이전 명령 또는 프로세스의 종료 코드를 나타냅니다.

    Metadata:
      Comment: Install HTTP Package
      'AWS::CloudFormation::Init':
        config:
          packages:
            yum:
              httpd: []
          files:
            "/var/www/html/index.html":
              content: |
                Hello world!
              mode: 000644
              owner: root
              group: root
        services:
          sysvinit:
            httpd:
              enabled: true
              ensureRunning: true
              
  SampleWaitCondition:
    CreationPolicy:
      ResourceSignal:
        Timeout: PT2M

 

 

# 사용 예제 - cfn-signal 사용 예제

AWSTemplateFormatVersion: 2010-09-09
Description: >-
  AWS CloudFormation Template to create VPC, Subnet, Internet Gateway, Routing
  Table, and EC2 Instance
Parameters:
  KeyName:
    Type: 'AWS::EC2::KeyPair::KeyName'
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
Resources:
  MyVPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 192.168.0.0/16
      Tags:
        - Key: Name
          Value: CFVPC_192.168.0.0
    
  MySubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      AvailabilityZone: ap-northeast-2a
      CidrBlock: 192.168.0.0/24
      Tags:
        - Key: Name
          Value: CFVPC_Public
    
  MyInternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Properties:
      Tags:
        - Key: Name
          Value: CF_IGW
    
  AttachGateway:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref MyVPC
      InternetGatewayId: !Ref MyInternetGateway
    
  MyRouteTable:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: CF_RouteTable
    
  DefaultRoute:
    Type: 'AWS::EC2::Route'
    Properties:
      RouteTableId: !Ref MyRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref MyInternetGateway
    
  SubnetRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref MySubnet
      RouteTableId: !Ref MyRouteTable
  MySecurityGroup1:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: Enable SSH access
      VpcId: !Ref MyVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
    
  MyInstance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: t2.micro
      ImageId: ami-081a36454cdf357cb
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          DeleteOnTermination: true
          SubnetId: !Ref MySubnet
          GroupSet:
            - !Ref MySecurityGroup1
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash 
            yum install -y aws-cfn-bootstrap 
            /opt/aws/bin/cfn-init -s ${AWS::StackId} -r MyInstance --region ${AWS::Region}
            /opt/aws/bin/cfn-signal -e $?  -stack ${AWS::StackId} --resource SampleWaitCondition --region ${AWS::Region}

    Metadata:
      Comment: Install HTTP Package
      'AWS::CloudFormation::Init':
        config:
          packages:
            yum:
              httpd: []
          files:
            "/var/www/html/index.html":
              content: |
                Hello world!
              mode: 000777
              owner: root
              group: root
        services:
          sysvinit:
            httpd:
              enabled: true
              ensureRunning: true
           
  SampleWaitCondition:
    CreationPolicy:
      ResourceSignal:
        Timeout: PT2M
    Type: AWS::CloudFormation::WaitCondition

 

728x90

'AWS' 카테고리의 다른 글

AWS - Cloud Front (CDN)  (0) 2024.03.22
AWS - CloudFormation (실습)  (0) 2024.03.07
AWS - CloudFormation  (1) 2024.03.07
AWS - S3 (Simple Storage Service)  (0) 2024.03.02
AWS - Elastic File Storage (EFS)  (0) 2024.03.02