AWS CloudFormation - 교차 스택으로 네트워크 및 서버 스택을 별도로 관리
18923 단어 cloudformationdevopsawstutorial
🗒️ 내용
1. AWS 클라우드포메이션 101
1.1. IaC(코드형 인프라)
개발자가 코드를 처리하는 것과 동일한 방식으로 인프라를 처리하는 것은 DevOps의 가장 기본적인 원칙 중 하나입니다.
Infrastructure as code (IaC) means provisioning, configuring and managing your infrastructure resources using code and templates.
1.2. AWS 클라우드포메이션
AWS CloudFormation is a service speeding up cloud provisioning with infrastructure as code
AWS 리소스 및 인프라 아키텍처는 JSON 또는 YAML(권장) 형식의 텍스트 파일로 작성된 CloudFormation 템플릿에서 모델링되고 설명됩니다. 그런 다음 CloudFormation이 해당 리소스의 프로비저닝 및 구성을 처리합니다.
아래 다이어그램과 같이 스택을 생성하기 위한 CloudFormation 워크플로우
CloudFormation 워크플로(출처: https://aws.amazon.com/cloudformation/ )
2. CloudFormation 템플릿 구조
!Ref <parameter>
를 사용하여 스택을 생성/업데이트할 때마다 템플릿에 사용자 정의 값을 입력합니다.!FindInMap [ <map_name>, <top_key>, <second_key> ]
.Export
와 다른 스택의 !ImportValue <export_name>
를 사용하여 다른 스택의 값을 참조합니다3. Hands-on Lab: 크로스 스택으로 네트워크 및 서버 스택을 별도로 관리
다음 아키텍처를 사용하여 간단한 웹 애플리케이션을 개발한다고 가정합니다.
인프라를 2개의 템플릿으로 분리하면 인프라를 더 쉽게 관리하는 데 도움이 될 수 있습니다.
3.1. LabNetworkStack
lab_network_cfn.yml
의 내용:Description: This template manages network components
Parameters:
ApplicationName:
Description: An application name that is prefixed to resource names
Type: String
Default: lab
VpcCidr:
Description: The IP range (CIDR notation) for VPC in form x.x.x.x/16-28
Type: String
AllowedPattern: "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(1[6-9]|2[0-8]))$"
Default: 10.192.0.0/16
PublicSubnetCidr:
Description: The IP range (CIDR notation) for public subnet in form x.x.x.x/16-28
Type: String
AllowedPattern: "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(1[6-9]|2[0-8]))$"
Default: 10.192.10.0/24
Resources:
Vpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub '${ApplicationName}-vpc'
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref Vpc
CidrBlock: !Ref PublicSubnetCidr
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub '${ApplicationName}-public-subnet'
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub '${ApplicationName}-igw'
InternetGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref Vpc
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref Vpc
Tags:
- Key: Name
Value: !Sub '${ApplicationName}-rtb'
DefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: InternetGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet
Outputs:
VpcId:
Description: The VPC ID of lab application
Value: !Ref Vpc
Export:
Name: !Sub '${AWS::StackName}-VpcId'
SubnetId:
Description: The Subnet ID of lab application
Value: !Ref PublicSubnet
Export:
Name: !Sub '${AWS::StackName}-PublicSubnetId'
템플릿은 AWS CLI로 배포할 수 있습니다.
aws s3 cp lab_network_cfn.yml s3://<your_bucket>
aws cloudformation create-stack --stack-name LabNetworkStack --template-url https://<your_bucket>.s3.<your_region>.amazonaws.com/lab_network_cfn.yml
3.2. LabServerStack
lab_server_cfn.yml
의 내용:Description: This template manages servers components
Parameters:
ApplicationName:
Description: An application name that is prefixed to resource names
Type: String
Default: lab
Landscape:
Type: String
Default: develop
AllowedValues:
- develop
- production
NetworkStackName:
Description: The name of Network CloudFormation stack
Type: String
Default: LabNetworkStack
Mappings:
RegionMap:
ap-southeast-1:
AMI: ami-02ee763250491e04a
ap-southeast-2:
AMI: ami-0e040c48614ad1327
Conditions:
IsProduction: !Equals [ !Ref Landscape, production]
Resources:
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub 'Security group for ${ApplicationName} instances'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
VpcId: !ImportValue
'Fn::Sub': '${NetworkStackName}-VpcId'
Tags:
- Key: Name
Value: !Sub '${ApplicationName}-srg'
Ec2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !FindInMap [ RegionMap, !Ref 'AWS::Region', AMI ]
InstanceType: !If [ IsProduction, t2.small, t2.micro ]
KeyName: your_key_name
SubnetId: !ImportValue
'Fn::Sub': '${NetworkStackName}-PublicSubnetId'
SecurityGroupIds:
- !Ref SecurityGroup
BlockDeviceMappings:
- DeviceName: "/dev/sda1"
Ebs:
VolumeSize: 12
VolumeType: gp2
Encrypted: true
UserData:
"Fn::Base64":
!Sub |
#!/bin/bash
apt update
apt install apache2 -y
Tags:
- Key: Name
Value: !Sub '${ApplicationName}-ec2'
Outputs:
InstanceIp:
Description: The IP address of instance
Value: !GetAtt Ec2Instance.PublicIp
템플릿은 AWS CLI로 배포할 수 있습니다.
aws s3 cp lab_server_cfn.yml s3://<your_bucket>
aws cloudformation create-stack --stack-name LabServerStack --template-url https://<your_bucket>.s3.<your_region>.amazonaws.com/lab_server_cfn.yml
확인
CREATE_COMPLETE
.http://your_server_ip
.3.3. 깨끗한 자원
콘솔 또는 AWS CLI에서 다음 순서로 스택을 삭제할 수 있습니다.
aws cloudformation delete-stack --stack-name LabServerStack
aws cloudformation delete-stack --stack-name LabNetworkStack
Reference
이 문제에 관하여(AWS CloudFormation - 교차 스택으로 네트워크 및 서버 스택을 별도로 관리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vinhle/hands-on-aws-cloudformation-separately-manage-network-and-server-stacks-by-cross-stacks-4km4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)