전반부에서는 클라우드 리소스 들의 관계를 정의하고 시스템 배치를 자동화해주는 오케스트레이션의 기본 개념과템플릿구문, 그리고 오케스트레이션 관련 툴 을 배우자.
오토메이션(ex. mvn package
, docker build image
) 을 위해 오케스트레이션(ex. 깃허브 액션
) 이 필요함 .
cf) devOps
클라우드 인프라
그림 8.1. 첨부
https://www.networkcomputing.com/cloud-infrastructure/cloud-orchestration-vs-devops-automation
클라우드의 오케스트레이션 = 클라우드 관리 츨랫폼에서 제공하는 리소스 api 를 이용해 사람의 판단과 수작업이 필요한 작업을 자동화하는 것이다.
infrastructure as Code
오케스트에이션 및 오토메이션 접근 방법 분류
절차형 툴
for person in people:
print(person.name)
선언형 툴 (sql)
select name from people
시스템 리소스들을 하나의 템플릿으로 정의하고 이 템플릿을 통해 인프라의 프로비저닝을 하도록 만들어짐
aws cloudFormation을 쉽게 사용하도록 , json 대신 Ruby 로 제어하게(선언-> 절차) Kumogata 같은 툴도 있다.
선언형 툴과 절차형 툴의 적용범위
그림 8-2
1-2 가 주로 선언형 툴이라 부른aws cloudFormation(json, yaml), 오픈 스택 Heat(json ,yaml) 활용가능
3-4 가 클라우드서비스의 제어 부분에 들어가지 않기 때문에 Puppet, Ansible 같은 절차형 툴이 활용됨.
aws OpsWorks : Chef + OpsWork -> 1-4 커버 가능
CloudFormation 과 쉐프 퍼펫 연계하는 가이드 문서와 샘플 템플릿 또한 제공중
aws cloudFormation : cfn-init
, cfn-get-metadata
, cfn-hub
와 같은 헬퍼 스크립트나 5장에서 소개한 UserData 로 os 관련 미들웨어 설정에 일부 기여 가능
https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/aws-resource-init.html
config ⇒ cfn-init -c test1
# 예제 1. config ⇒ cfn-init -c test1
# [<https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/aws-resource-init.html>](<https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/aws-resource-init.html>)
"AWS::CloudFormation::Init" : {
"configSets" : {
"test1" : [ "1" ],
"test2" : [ { "ConfigSet" : "test1" }, "2" ],
"default" : [ { "ConfigSet" : "test2" } ]
},
"1" : {
"commands" : {
"test" : {
"command" : "echo \\"$MAGIC\\" > test.txt",
"env" : { "MAGIC" : "I come from the environment!" },
"cwd" : "~"
}
}
},
"2" : {
"commands" : {
"test" : {
"command" : "echo \\"$MAGIC\\" >> test.txt",
"env" : { "MAGIC" : "I am test 2!" },
"cwd" : "~"
}
}
}
}
# 예제2. 5장에서 소개한 UserData 로 os 관련 미들웨어 설정에 일부 기여 가능
"Resources" : {
...
"WebServer": {
"Type" : "AWS::EC2::Instance",
"Properties": {
"ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
{ "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] },
"InstanceType" : { "Ref" : "InstanceType" },
"SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ],
"KeyName" : { "Ref" : "KeyName" },
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -xe\\n",
"yum update -y aws-cfn-bootstrap\\n",
"/opt/aws/bin/cfn-init -v ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource WebServer ",
" --configsets wordpress_install ",
" --region ", { "Ref" : "AWS::Region" }, "\\n",
"/opt/aws/bin/cfn-signal -e $? ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource WebServer ",
" --region ", { "Ref" : "AWS::Region" }, "\\n"
]]}}
},
...
},
...
"WebServerSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable HTTP access via port 80 locked down to the load balancer + SSH access",
"SecurityGroupIngress" : [
{"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"},
{"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : { "Ref" : "SSHLocation"}}
]
}
},
...
},
# 예제3. cfn-init 구문
Resources:
MyInstance:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Init:
config:
packages:
:
groups:
:
users:
:
sources:
:
files:
:
commands:
:
services:
:
Properties:
:
1-4 모두 IaC 범위