외로운 Nova의 작업실

aws - CloudFormation 본문

Cloud/aws

aws - CloudFormation

Nova_ 2023. 10. 18. 17:27

- CloudFormation

CloudFormation은 미리 만든 템플릿을 이용하여 AWS 리소스 생성과 배포를 자동화합니다. CloudFormation은 실제로 서비스를 제공하는 AWS 리소스가 아니라서 사용 요금이 ㅇ벗습니다.

 

EC2인스턴스 1000개를 생성하고 웹서버를 설치한 뒤 소스코드를 복사하여 각각 웹서비스를 시작해야한다면 어떻게 해야될까요? AMI 이미지를 만들어 놓고 EC2 인스턴스를 1000개 생성하면됩니다. 하지만, 소스 코드가 바뀔때마다 AMI 이미지를 만들어야합니다. 그리고 EC2 인스턴스 뿐만아니라 EBS 볼륨과 S3 버킷, RDS 인스턴스, ELB 로드 밸런서를 함께 생성해야한다면 AMI로는 불가능합니다.

 

서비스에 필요한 EC2, EBS, S3, RDS를 미리 구성한대로 자동 생성하는 기능이 CloudFormation입니다. CloudFormation에서 지원하는 AWS 리소스는 다음과 같습니다.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html

 

AWS resource and property types reference - AWS CloudFormation

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

 

사용자가 구성한 시스템 구조를 CloudFormation 템플릿으로 만들면 복잡하고 반복적인 작업을 간단하게 처리할 수 있습니다. 템플릿 파일은 JSON 형식의 파일이고, AWS에서 제공하는 미리 만들어진 템플릿을 사용할 수 있습니다.

CloudFormation 템플릿은 AWS 리소스 생성 및 설정뿐만 아니라 EC2 인스턴스에 소프트웨어를 설치하고 설정할 수 있습니다. 소프트웨어 자동화에 chef, puppet(소프트웨어 설치, 설정, 빌드, 배포 자동화 솔루션)과cloud-init(클라우드 인스턴스의 초기화를 위한 스크립트 솔루션)등도 가능합니다.

CloudFormation 템플릿으로 생성한 AWS 리소스 조합을 CloudFormation 스택이라고합니다. 이 스택을 삭제하면 관련된 AWS 리소스도 모두 삭제됩니다.

 

- CloudFormation 템플릿 기본 구조

아래는 CloudFormation 템플릿의 가장 기본적인 형태입니다.

Description : 템플릿의 설명

Parameters : 템플릿으로 스택을 생성할 때 사용자가 입력할 매개변수 목록

Resources : AWS 리소스 종류와 옵션, AWS 리소스 간의 관계를 정의합니다.

Outputs : 스택을 생성한 뒤 출력할 값입니다.

{
  // CloudFormation 템플릿 버전
  "AWSTemplateFormatVersion": "2010-09-09",
  
  // 템플릿에 대한 간단한 설명
  "Description": "Basic CloudFormation Template with Comments",
  
  // 리소스 섹션 (리소스는 여기에 정의됨)
  "Resources": {},
  
  // Output 섹션 (Stack 생성 시 출력할 값 정의)
  "Outputs": {
    // 예시 출력 값
    "ExampleOutput": {
      "Value": "Hello, CloudFormation!",
      "Description": "An example output value"
    }
  }
}

 

- EC2 생성 템플릿

{
  "Description" : "Create an EC2 instance running the Amazon Linux 64 bit AMI.",
  "Parameters" : {
    "KeyPair" : {
      "Description" : "The EC2 Key Pair to allow SSH access to the instance",
      "Type" : "String",
      "Default" : "awskeypair"
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "KeyName" : { "Ref" : "KeyPair" },
        "ImageId" : "ami-057b209cfeae23c21",
        "InstanceType" : "t2.micro"
      }
    }
  },
  "Outputs" : {
    "InstanceId" : {
      "Description" : "The InstanceId of the newly created EC2 instance",
      "Value" : {
        "Ref" : "Ec2Instance"
      }
    }
  },
  "AWSTemplateFormatVersion" : "2010-09-09"
}

keyPair 값을 주면 EC2 인스턴스가 생성되는 Templete입니다.

 

- EC2 인스턴스 + 웹서버 템플릿

{
  "Description" : "Create an EC2 instance running the Amazon Linux 64 bit AMI.",
  "Parameters" : {
    "KeyPair" : {
      "Description" : "The EC2 Key Pair to allow SSH access to the instance",
      "Type" : "String",
      "Default" : "awskeypair"
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "KeyName" : { "Ref" : "KeyPair" },
        "ImageId" : "ami-057b209cfeae23c21",
        "InstanceType" : "t2.micro",
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [ "",
              [ "#!/bin/bash\n",
              "/opt/aws/bin/cfn-init --region ", {  "Ref": "AWS::Region" },
              " -s ", { "Ref": "AWS::StackName" },
              " -r Ec2Instance\n" ]
            ]
          }
        }
      },
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "config" : {
            "packages" : {
              "yum" : {
                "httpd" : []
              }
            },
            "services" : {
              "sysvinit" : {
                "httpd" : {
                  "enabled" : "true",
                  "ensureRunning" : "true"
                }
              }
            }
          }
        }
      }
    }
  },
  "Outputs" : {
    "InstanceId" : {
      "Description" : "The InstanceId of the newly created EC2 instance",
      "Value" : {
        "Ref" : "Ec2Instance"
      }
    }
  },
  "AWSTemplateFormatVersion" : "2010-09-09"
}

메타데이터를 통해 httpd를 설치하고 services를 통해 httpd를 실행시키고 있습니다.

 

- EC2 인스턴스 + 보안 그룹 템플릿

 

{
  "Description" : "Create an EC2 instance running the Amazon Linux 64 bit AMI.",
  "Parameters" : {
    "KeyPair" : {
      "Description" : "The EC2 Key Pair to allow SSH access to the instance",
      "Type" : "String",
      "Default" : "awskeypair"
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "KeyName" : { "Ref" : "KeyPair" },
        "ImageId" : "ami-c9562fc8",
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "InstanceType" : "t1.micro"
      }
    },
    "InstanceSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Allow HTTP and SSH access",
        "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"
        } ]
      }
    }
  },
  "Outputs" : {
    "InstanceId" : {
      "Description" : "The InstanceId of the newly created EC2 instance",
      "Value" : {
        "Ref" : "Ec2Instance"
      }
    }
  },
  "AWSTemplateFormatVersion" : "2010-09-09"
}

InstanceSecurityGroup 키값을 통해 보안 그룹을 설정해주고 있습니다.

 

- 인스턴스 + 웹서버 + 보안그룹 템플릿

{
  "Description" : "Create an EC2 instance running the Amazon Linux 64 bit AMI.",
  "Parameters" : {
    "KeyPair" : {
      "Description" : "The EC2 Key Pair to allow SSH access to the instance",
      "Type" : "String",
      "Default" : "StudyServerKey"
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "KeyName" : { "Ref" : "KeyPair" },
        "ImageId" : "ami-057b209cfeae23c21",
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "InstanceType" : "t2.micro",
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [ "",
              [ "#!/bin/bash\n",
              "/opt/aws/bin/cfn-init --region ", {  "Ref": "AWS::Region" },
              " -s ", { "Ref": "AWS::StackName" },
              " -r Ec2Instance\n" ]
            ]
          }
        }
      },
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "config" : {
            "packages" : {
              "yum" : {
                "httpd" : []
              }
            },
            "services" : {
              "sysvinit" : {
                "httpd" : {
                  "enabled" : "true",
                  "ensureRunning" : "true"
                }
              }
            }
          }
        }
      }
    },
    "InstanceSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Allow HTTP and SSH access",
        "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"
        } ]
      }
    }
  },
  "Outputs" : {
    "InstanceId" : {
      "Description" : "The InstanceId of the newly created EC2 instance",
      "Value" : {
        "Ref" : "Ec2Instance"
      }
    }
  },
  "AWSTemplateFormatVersion" : "2010-09-09"
}

이제까지 해왔던 템플릿을 합친 템플릿입니다. 이것으로 스택을 생성해보겠습니다.

스택 생성을 눌러줍니다.

템플릿을 업로드해주고 다음을 눌러줍니다.

다른건 기본으로하고 생성해줍니다.

만드는 중에 있습니다. 잠시 기다려보겠습니다.

보안그룹이 httpd-stack-~인 인스턴스가 하나 생겼습니다. 80포트로 접속해보겠습니다.

접속이 잘 되는 것을 확인할 수 있습니다.

 

- 스택 삭제

CloudFormation 스택을 삭제하면 지금까지 생성도니 AWS 리소스 모두 삭제됩니다. 즉 100개 생성했다면 100개 모두 지워집니다.

 

'Cloud > aws' 카테고리의 다른 글

aws - OpsWorks  (0) 2023.10.20
aws - Elastic Beanstalk  (0) 2023.10.20
aws - Glacier  (0) 2023.10.18
aws - VPC  (0) 2023.10.18
aws - Auto Scaling  (0) 2023.10.18
Comments