사용자 데이터를 사용하여 EC2 구축 작업을 간소화
대상
OS: Redhat6.7
절차 개요
실제로는 좀 더 다양한 설정 변경을 실시하고 있습니다만, 예로서 하기의 자동화에 짜서 쓰고 싶습니다.
·/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
Reference
이 문제에 관하여(사용자 데이터를 사용하여 EC2 구축 작업을 간소화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yaseinoa/items/54dcd2b7da25f2519912텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)