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 |