사용자 데이터를 사용하여 EC2 구축 작업을 간소화

EC2를 작성 후 매번 같은 설정 변경을 하는 운용이었습니다만, 「사용자 데이터」기능을 활용해 작업 시간을 단축할 수 있었습니다.

대상



OS: Redhat6.7

절차 개요


  • 원래 EC2에 필요한 처리를 작성한 Shellscrypt 배치
  • 1. EC2 인스턴스에서 AMI 만들기
  • 이후 EC2 인스턴스 생성시 2. AMI 및 사용자 데이터 지정
  • 완성

  • 실제로는 좀 더 다양한 설정 변경을 실시하고 있습니다만, 예로서 하기의 자동화에 짜서 쓰고 싶습니다.
    ·/etc/hosts 변경
    ·/etc/sysconfig/network 변경

    이 파일들을

    /etc/hosts(변경 전)
    127.0.0.1   yaseinohost_number localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    

    /etc/sysconfig/network (변경 전)
    NETWORKING=yes
    HOSTNAME=yaseinohost_number
    NETWORKING_IPV6=no
    NOZEROCONF=yes
    

    이렇게 변경하고 싶습니다 ( "number"부분을 숫자로 바꾸고 싶습니다)

    /etc/hosts(변경 후)
    127.0.0.1   yaseinohost_100 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    

    /etc/sysconfig/network(변경 후)
    NETWORKING=yes
    HOSTNAME=yaseinohost_100
    NETWORKING_IPV6=no
    NOZEROCONF=yes
    

    절차



    1. 원본 EC2에 ShellScript를 배치합니다.



    /home/ec2-user/script/autoconfig.sh
    #!/bin/sh -x
    
    #Get SecurityGroupName from meta-data and extract number
    number=`curl -s http://169.254.169.254/latest/meta-data/security-groups |sed -e 's/yaseino-//g'  -e 's/-SG//g'`
    
    #Modify file "/etc/hosts"
    cp -ip /etc/hosts /etc/hosts`date "+%Y%m%d_%H%M%S"`
    sed -i -e "s/number/${number}/g" /etc/hosts
    cat /etc/hosts
    
    #Modify file "/etc/sysconfig/network"
    cp -ip /etc/sysconfig/network /etc/sysconfig/network`date "+%Y%m%d_%H%M%S"`
    sed -i -e "s/number/${number}/g" /etc/sysconfig/network
    cat /etc/sysconfig/network
    

    해설:
    「number」에 넣는 숫자는 보안 그룹명의 숫자와 맞추고 싶기 때문에, meta-data로부터 취득했습니다.
    #meta-dataからセキュリティグループ名を取得できる
    $curl -s http://169.254.169.254/latest/meta-data/security-groups
    yaseino-100-SG
    #さらにsedで不要な文字列をカット
    $curl -s http://169.254.169.254/latest/meta-data/security-groups |sed -e "s/yaseino-//g"  -e "s/-SG//g"
    100
    

    보안 그룹 외에도 meta-data에서 다양한 값을 얻을 수 있습니다.
    $ curl -s http://169.254.169.254/latest/meta-data/
    ami-id
    ami-launch-index
    ami-manifest-path
    block-device-mapping/
    events/
    hostname
    identity-credentials/
    instance-action
    instance-id
    instance-type
    local-hostname
    local-ipv4
    mac
    metrics/
    network/
    placement/
    profile
    public-hostname
    public-ipv4
    public-keys/
    reservation-id
    security-groups
    

    숫자를 얻을 수 있으면, 나머지는 각 파일의 내용을 sed로 재기록하는 것입니다.

    또한/etc/cloud/cloud.cfg에 다음을 정의합니다.
    (인스턴스를 처음 시작할 때 ip-XX-XX-XX-XX라는 Private IP를 기반으로 한 호스트 이름으로 변경되기 때문에)
    preserve_hostname: True
    

    2. EC2에서 AMI를 생성합니다.



    AWS Management Console>EC2>에서 1단계의 인스턴스를 선택하고,
    동작 > 이미지 > 이미지 생성

    3. 이후 새로운 EC2 인스턴스 생성 시 2. AMI 및 사용자 데이터 지정



    Cloudformation 템플릿(YAML 형식)

    create_ec2.yaml
    AWSTemplateFormatVersion: '2010-09-09'
    Description: 'AWS CloudFormation Template for EC2'
    ----
    省略
    ----
    Resources:
      MyEC2instance:
        Type: "AWS::EC2::Instance"
        Properties:
          ImageId: !Ref 'ImageId'  #手順2. で作成したAMIを指定
          InstanceType: !Ref 'InstanceType'
          SubnetId: !Ref 'SubnetID'
          DisableApiTermination: False
          BlockDeviceMappings:
            - DeviceName: /dev/sda1
              Ebs:
                VolumeType: gp2
                VolumeSize: !Ref 'StorageSize'
          SecurityGroupIds: !GetAtt 'MyLinuxEC2SecurityGroups.GroupId'
          KeyName: !Ref 'Keyname'
          Tags: 
            - Key: Name
              Value: !Ref 'Hostname'
          UserData:
            Fn::Base64: !Sub |
              #cloud-config
              runcmd:
               - /home/ec2-user/script/auto_setting01.sh >/home/ec2-user/script/auto_setting.log 2>&1
               - reboot
    ----
    省略
    ----
    

    해설:
    · "UserData :"속성을 사용합니다.
    · #cloud-config를 선언하고 runcmd :에 그대로 명령을 쓸 수 있습니다.
    · #!/bin/bash를 선언하면 직접 쉘 스크립트를 실행할 수도 있습니다.
    · #cloud-config와 #!/bin/bash를 모두 실행하려면 약간의 요령이있는 것 같습니다.
    htps : //에서 v.ぁsss d. jp / c ぉ d / 아 ws / c ぉ う い う う う う う ー
    · 설정을 반영하기 위해 재부팅하고 있습니다.
    · Cloudformation이 아닌 직접 EC2를 작성하는 경우에도 사용자 데이터를 작성할 수 있습니다.
     (EC2 작성 도중 화면 > 고급 상세 > 사용자 데이터)


    4. 완성



    EC2가 작성된 후, 사용자 데이터에 기재된 처리가 자동으로 실행됩니다.
    그만큼 조금만 작성 완료까지 시간이 걸렸습니다.

    출력된 로그를 확인해 봅니다.
    잘 움직인 것 같습니다.

    /home/ec2-user/script/auto_setting.log
    ++ curl -s http://169.254.169.254/latest/meta-data/security-groups
    ++ sed -e s/yaseino-//g -e s/-SG//g
    + number=100
    ++ date +%Y%m%d_%H%M%S
    + cp -ip /etc/hosts /etc/hosts20191025_031836
    + sed -i -e s/number/100/g /etc/hosts
    + cat /etc/hosts
    127.0.0.1   yaseinohost_100 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    ++ date +%Y%m%d_%H%M%S
    + cp -ip /etc/sysconfig/network /etc/sysconfig/network20191025_031836
    + sed -i -e s/number/100/g /etc/sysconfig/network
    + cat /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=yaseinohost_100
    NETWORKING_IPV6=no
    NOZEROCONF=yes
    

    실제로 파일도 확인해 보겠습니다.

    /etc/hosts
    127.0.0.1   yaseinohost_100 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    

    /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=yaseinohost_100
    NETWORKING_IPV6=no
    NOZEROCONF=yes
    

    좋은 웹페이지 즐겨찾기