CloudFormation을 이용하여 인프라 관리 Yaml 파일 생성

2024. 3. 2. 16:38·AWS Cloud School/project

CloudFormation이란?

AWS CloudFormation은 Amazon Web Services(AWS) 리소스를 모델링하고 설정할 수 있게 해주는 서비스입니다. 이를 통해 개발자와 시스템 관리자는 코드를 통해 인프라를 자동으로 생성하고 관리할 수 있습니다. CloudFormation을 사용하면 서버, 로드 밸런서, 데이터베이스와 같은 필요한 AWS 리소스들을 정의한 템플릿을 작성하고, 이 템플릿을 사용하여 인프라를 안전하고 일관된 방식으로 프로비저닝하고 관리할 수 있습니다.

즉, Infrastructure as Code형태로 관리를 할 수 있으며, 이는 버전 관리, 재사용, 자동화에 유용합니다.

CloudFromation의 장점

  1. 자동화: 수동 프로비저닝과 구성을 줄여 시간을 절약하고 오류를 최소화합니다.
  2. 일관성: 동일한 템플릿을 사용하여 여러 환경(개발, 테스트, 프로덕션 등)에서 일관된 인프라를 쉽게 배포할 수 있습니다.
  3. 종속성 관리: CloudFormation은 리소스 간의 종속성을 자동으로 관리하며, 리소스를 올바른 순서로 생성합니다.
  4. 롤백 기능: 업데이트 중 오류가 발생하면 이전 상태로 롤백할 수 있어 리소스와 데이터의 안전을 보장합니다.
  5. 드리프트 감지: 인프라의 현재 상태와 CloudFormation 템플릿이 정의한 상태 사이의 차이(드리프트)를 감지할 수 있습니다.

CloudFormation의 작동 방식

  1. 템플릿 작성: AWS 리소스와 그 속성을 JSON 또는 YAML 포맷의 템플릿 파일로 정의합니다.
  2. 스택 생성: 템플릿을 CloudFormation에 업로드하고 스택을 생성하여 정의된 리소스들을 프로비저닝합니다.
  3. 관리 및 업데이트: 스택을 통해 인프라를 관리하고, 템플릿을 업데이트하여 인프라 변경 사항을 적용합니다.
  4. 리소스 삭제: 스택 삭제를 통해 정의된 모든 리소스를 자동으로 정리합니다.

 

구성해볼 아키택쳐 설명

  • VPC 안에 2개의 가용영역을 사용해 고가용성을 더욱 높입니다.
  • 하나의 가용영역에는 public subnet 1개와 private subnet 2개가 존재합니다.
  • public subnet 부분에 존재하는 인터넷단 로드밸런서를 생성해 인터넷 게이트웨이를 통해 외부와 통신 할 수 있게 해줍니다.
  • public subnet 2개에는 각각 NatGateway를 만들어 private subnet이 Nat Gateway를 통해 외부와 통신할 수 있게 합니다.
  • 처음 Web단의 오토스케일링 그룹을 생성하고 인터넷단 로드밸런서와 연결합니다. 이 Web단 오토스케일링 그룹은 DaynamoDB를 사용합니다.
  • APP단과 WEB단을 연결해주는 내부 로드발란서가 존재합니다. 이 로드발란서를 통해 Web단에서 App단으로 트래픽이 보내집니다.
  • App단도 오토스케일링 그룹이 존재하고 EFS라는 파일 공유시스템을 가지고 있어 각각 인스턴스에서 파일을 공유할 수 있습니다.
  • RDS는 다중영역 배포를 하여 Master와 Stand-By DB를 생성합니다. 이를 통해 Switch over와 Fail over를 할 수 있게합니다.
  • 또한 ElastiCache에 인 메모리 DB인 Redis를 사용해 자주 사용하는 데이터는 빠르게 검색할 수 있게합니다.

 

CloudFormation Yaml 코드

문법 종류

파라미터

Parameters:
  InstanceType:
    Type: String
    Default: t2.micro
    Description: EC2 instance type for the Bastion Host and AppServer
  
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
  
  DBInstanceClass:
    Type: String
    Default: db.t2.small
    Description: The database instance type
    
  MasterUsername:
    Type: String
    Description: The master username for the database instance.
  
  MasterUserPassword:
    Type: String
    Description: The RDS MasterUserPassword
  
  CacheNodeType:
    Type: String
    Default: cache.t2.small
    Description: The version of the ElastiCache Node
  • 값을 정해놓기 애매한 것은 이렇게 Paramemter를 설정할 수 있습니다.

VPC 생성

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.10.0.0/16
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: ##VPC 이름
  • Properties는 AWS 리소스의 속성을 설정하는 데 사용됩니다.
  • 제일 처음은 VPC를 만들어야 합니다. 자원 안에 Type을 AWS::EC2::VPC로 설정하고 CIDR을 설정해줍니다. 
  • EnableDnsHostnames
    • 인스턴스 간에 DNS 호스트 이름을 사용하여 통신해야 할 때
    • 외부에서 인스턴스의 퍼블릭 DNS 이름을 통해 접근해야 할 때

Subnet 생성

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.10.0.0/24
      AvailabilityZone: "us-east-1a"
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet1
  • !Ref는 AWS CloudFormation 템플릿에서 사용되는 인트린직 함수(내부 함수)입니다. 이 함수는 템플릿 내에서 선언된 파라미터의 값을 가져오거나, 다른 리소스에 대한 참조(예: 리소스의 논리적 ID)를 생성하는 데 사용됩니다.
  • MapPublicIpOnLaunch 
    • 속성은 서브넷에 있는 EC2 인스턴스가 시작될 때 자동으로 퍼블릭 IPv4 주소가 할당되도록 지정합니다.
    • 이 서브넷 내에서 새로 생성되는 모든 EC2 인스턴스에 자동으로 퍼블릭 IP 주소가 할당됩니다.
  • 만약 PrivateSubnet을 설정하고 싶으면 MapPublicIpOnLaunch 이 부분을 빼면 됩니다.

Internet Gateway 생성

  IGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: MagicMin-igw
  Attachigw:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref IGW
      VpcId: !Ref VPC
  • AWS::EC2::InternetGateway를 통해 InternetGateway 생성
  • Attachigw는 논리적 이름입니다. Java에서 메소드 이름이라고 생각하면 쉽습니다.
  • Type: AWS::EC2::InternetGateway 이 부분을 통해 InternetGateway를 VPC에 붙이는 과정이라는 것을 알 수 있습니다.

NAT 생성

  EIP1:
    Type: AWS::EC2::EIP
  NAT1:
    Type: AWS::EC2::NatGateway
    DependsOn: Attachigw
    Properties:
      AllocationId: !GetAtt EIP1.AllocationId
      SubnetId: !Ref PublicSubnet1
  • 탄력적 IP를 생성해 고정 IP를 받습니다.
  • DependsOn
    • AWS CloudFormation에서 특정 리소스의 생성 순서를 제어하는 데 사용됩니다.
    • 일반적으로 CloudFormation은 리소스 간의 종속성을 자동으로 해결합니다.
    • 하지만 때때로, 특정 리소스가 다른 리소스가 완전히 생성되고 나서야 생성되어야 할 필요가 있을 때 DependsOn 속성을 사용하여 명시적으로 의존성을 지정할 수 있습니다.
  • AllocationId를 통해 EIP를 NAT에 할당합니다.
  • SubnetId를 통해 PublicSubnet1에 NAT를 할당합니다.

RouteTable 생성 및 세팅

  PublicRT:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: PublicRT
  PublicOneRoute:
    Type: AWS::EC2::Route
    DependsOn: Attachigw
    Properties:
      RouteTableId: !Ref PublicRT
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref IGW
  PublicSubnet1RTAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRT
      SubnetId: !Ref PublicSubnet1
  • 위의 아키택처를 보면 만들어야 할 RouteTable이 총 3개 필요합니다.
  • Public Subnet1,2에서 IGW로 보내야하는 라우트 테이블과 Private subnet 1,3에서 Public subnet1의 NAT로 보내야하는 Route Table, Private Subnet 2,4에서 Public Subnet2의 NAT로 보내야 하는 Route Table이 필요합니다.
  • 위의 코드는 Public Subnet에서 IGW로 보내는 Route Table입니다.
  • Type: AWS::EC2::RouteTable를 통해 라우트 테이블을 생성합니다. 
  • PublicOneRoute
    • DependsOn을 통해 Attachigw 생성 이후에 이 스택을 진행하도록 합니다.
    • DestinationCidrBlock 설정은 모든 목적지 주소(즉, 인터넷으로 가는 모든 트래픽)에 적용됨을 의미합니다.
    • Gateway : 이 라우트가 사용할 게이트웨이의 ID를 참조합니다. 여기서 IGW는 인터넷 게이트웨이의 논리적 이름이며, 이 라우트는 인터넷으로 가는 트래픽을 해당 게이트웨이로 전달하도록 설정됩니다.
  • PublicSubnet1RTAssociation
    • Type: AWS::EC2::SubnetRouteTableAssociation
      • 이 리소스 타입은 서브넷과 라우트 테이블 간의 연결(연관)을 정의합니다.

LoadBalancer 생성

  MyInternetFacingALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
     Name: MagicMinALB
     Scheme: internet-facing
     LoadBalancerAttributes:
      - Key: idle.timeout.timeout_seconds
        Value: '60'
     Subnets:
      - !Ref PublicSubnet1
      - !Ref PublicSubnet2
     SecurityGroups:
      - !Ref InternetFacingALBSecurityGroup
  
  InternetFacingALBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
     GroupDescription: Security Group for ALB
     VpcId: !Ref VPC
     SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: 443
        ToPort: 443
        CidrIp: 0.0.0.0/0
  
  InternetFacingALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref InternetFacingALBTargetGroup
      LoadBalancerArn: !Ref MyInternetFacingALB
      Port: 80
      Protocol: HTTP
      
  InternetFacingALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      VpcId: !Ref VPC
      Port: 80
      Protocol: HTTP
      HealthCheckProtocol: HTTP
      HealthCheckPath: /
      Matcher:
        HttpCode: '200'
  • MyInternetFacingALB
    • Type: AWS::ElasticLoadBalancingV2::LoadBalancer (ALB를 생성하기 위한 리소스 타입)
    • Scheme
      • ALB의 종류를 설정합니다. 위으 코드는 internet-facing를 적어 인터넷에 직접 노출되어 외부 트래픽을 받게 합니다.
      • 만약 내부 로드발란서를 새팅하고 싶으면 internal을 적으면 됩니다.
    • LoadBalancerAttributes
      • 로드 밸런서의 추가 설정을 의미합니다.
      • 유휴 연결 타임아웃을 60초로 설정했습니다.
  • InternetFacingALBSecurityGroup
    • Type: AWS::EC2::SecurityGroup (보안 그룹 세팅)
    • SecurityGroupIngress 
      • 인바운드 규칙을 정의합니다.
      • 여기서는 80번 포트(HTTP)와 443번 포트(HTTPS)로 들어오는 모든 트래픽을 허용합니다.

  • InternetFacingALBListener 
    • Type: AWS::ElasticLoadBalancingV2::Listener
      • 리스너는 들어오는 트래픽을 어떻게 처리할지 결정합니다.
    • DefaultActions 
      • 들어오는 트래픽에 대한 기본 동작을 설정합니다.
      • 여기서는 트래픽을 InternetFacingALBTargetGroup으로 전달합니다.
    • LoadBalancerArn
      • 리스터가 연결될 로드 밸런서의 ARN을 지정합니다.
  • InternetFacingALBTargetGroup
    • Type: AWS::ElasticLoadBalancingV2::TargetGroup
      • 로드 밸런서로부터 트래픽을 받을 대상 그룹을 정의합니다.
    • TargetGroup을 만들 때 사용했던 포트, VPC, 프로토콜 버전, 상태 검사를 지정 합니다.
    • 지금 위의 코드에는 대상 유형 선택이 없습니다. 그러므로 디폴트 값인 인스턴스로 지정됩니다.
    • 만약 다른 값으로 대상을 선택하고 싶으면 TargetType: ip와 같이 추가하면 됩니다.

DynamoDB 구성

  MyDynamoDBTable:
    Type: 'AWS::DynamoDB::Table'
    Properties:
      TableName: 'MyDynamoDBTable'
      AttributeDefinitions:
        - AttributeName: 'ID'
          AttributeType: 'S'
      KeySchema:
        - AttributeName: 'ID'
          KeyType: 'HASH'
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'  
        
  MyDynamoDBAccessRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service: 'ec2.amazonaws.com'
            Action: 'sts:AssumeRole'
      Policies:
        - PolicyName: 'DynamoDBAccessPolicy'
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: 'Allow'
                Action:
                  - 'dynamodb:GetItem'
                  - 'dynamodb:PutItem'
                  - 'dynamodb:UpdateItem'
                  - 'dynamodb:DeleteItem'
                  - 'dynamodb:Scan'
                  - 'dynamodb:Query'
                Resource: !GetAtt MyDynamoDBTable.Arn

  MyDynamoDBAccessInstanceProfile:
    Type: 'AWS::IAM::InstanceProfile'
    Properties:
      Roles:
        - !Ref MyDynamoDBAccessRole
  • 위의 아키택쳐에서 Web단 서버는 DynamoDB와 연결되어 있습니다.
  • DynamoDB는 VPC안에 있는 기능이 아니기 때무에 IAM으로 권한 설정을 해줘야 합니다.

  • MyDynamoDBTable
    • Type: AWS::DynamoDB::Table은 Amazon DynamoDB 테이블을 생성합니다.
    • AttributeDefinitions: 테이블의 속성 정의를 나열합니다. 여기서는 'ID'라는 속성 이름과 'S'(String 타입)를 사용합니다.
    • KeySchema: 테이블의 기본 키 구성을 정의합니다. 'ID' 속성이 HASH 키(기본 키)로 사용됩니다.
    • ProvisionedThroughput: 읽기 및 쓰기 용량 단위를 설정합니다. 이 설정은 DynamoDB 테이블의 처리량을 관리합니다.
  • MyDynamoDBAccessRole (IAM 역할)
    • Type: AWS::IAM::Role은 AWS 리소스에 대한 액세스 권한을 부여하는 IAM 역할을 생성합니다.
    • AssumeRolePolicyDocument: 이 역할을 어떤 AWS 서비스(여기서는 EC2)가 사용할 수 있는지 정의합니다.
    • Policies: 역할에 연결된 정책들을 나열합니다. 여기서는 'DynamoDBAccessPolicy'라는 정책을 정의하고, 이 정책은 DynamoDB 테이블에 대한 다양한 액션(GetItem, PutItem 등)을 허용합니다.
    • Resource: 정책이 적용될 리소스를 지정합니다. 여기서는 !GetAtt MyDynamoDBTable.Arn을 사용하여 이전에 정의한 DynamoDB 테이블의 ARN을 참조합니다.
  • MyDynamoDBAccessInstanceProfile (IAM 인스턴스 프로필)
    • Type: AWS::IAM::InstanceProfile은 EC2 인스턴스에 IAM 역할을 연결할 수 있게 해주는 인스턴스 프로필을 생성합니다.
    • Properties : Roles: 이 인스턴스 프로필에 연결할 IAM 역할들의 리스트입니다. 여기서는 !Ref MyDynamoDBAccessRole을 사용하여 이전에 정의한 IAM 역할을 참조합니다.

AutoScaling Group

  MyWebLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: MyWebLaunchTemplate
      LaunchTemplateData:
        InstanceType: !Ref InstanceType
        ImageId: ami-014d544cfef21b42d # EC2 인스턴스에 사용될 AMI의 ID를 지정
        KeyName: !Ref KeyName
        SecurityGroupIds:
          - !Ref EC2SecurityGroup
        IamInstanceProfile:
          Arn: !GetAtt MyDynamoDBAccessInstanceProfile.Arn
        TagSpecifications: # EC2 인스턴스에 할당될 태그를 지정
          - ResourceType: instance
            Tags:
              - Key: Name
                Value: MinEC2Web
        UserData:      # EC2 인스턴스가 시작될 때 실행될 사용자 데이터를 지정
         Fn::Base64: | #  base64로 인코딩된 스크립트를 포함
           #!/bin/bash
            yum update -y
            yum install -y httpd php
            systemctl start httpd
            systemctl enable httpd
            usermod -a -G apache ec2-user
            chown -R ec2-user:apache /var/www
            chmod 2775 /var/www
            find /var/www -type d -exec chmod 2775 {} \;
            find /var/www -type f -exec chmod 0664 {} \;
            # PHP script to display Instance ID and Availability Zone
            cat << 'EOF' > /var/www/html/index.php
            <!DOCTYPE html>
            <html>
            <body>
              <center>
                <?php
                  # Get the instance ID from meta-data and store it in the $instance_id variable
                  $url = "http://169.254.169.254/latest/meta-data/instance-id";
                  $instance_id = file_get_contents($url);
                  # Get the instance's availability zone from metadata and store it in the $zone variable
                  $url = "http://169.254.169.254/latest/meta-data/placement/availability-zone";
                  $zone = file_get_contents($url);
                ?>
                <h2>EC2 Instance ID: <?php echo $instance_id ?></h2>
                <h2>Availability Zone: <?php echo $zone ?></h2>
              </center>
            </body>
            </html>
            EOF
  • MyWebLaunchTemplate (런치 템플릿)
    • Type: AWS::EC2::LaunchTemplate은 EC2 인스턴스를 생성할 때 사용할 수 있는 설정의 모음입니다.
    • LaunchTemplateName: 런치 템플릿의 이름입니다.
    • LaunchTemplateData: 인스턴스 생성에 사용될 구성 정보입니다.
    • InstanceType: 인스턴스의 유형입니다. 파라미터로 받아옵니다.
    • ImageId: 인스턴스에 사용될 AMI(Amazon Machine Image)의 ID입니다.
    • KeyName: 인스턴스에 접근하기 위한 키 페어의 이름입니다.
    • SecurityGroupIds: 인스턴스가 속할 보안 그룹의 ID 리스트입니다.
    • IamInstanceProfile: 인스턴스가 사용할 IAM 인스턴스 프로필의 ARN입니다.
    • TagSpecifications: 인스턴스에 적용될 태그를 정의합니다.
    • UserData : EC2가 생성할 때 실행시켜야할 명령어를 입력할 수 있습니다.
  MyWebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier:
        - !Ref PrivateSubnet1
        - !Ref PrivateSubnet2
      LaunchTemplate:
        LaunchTemplateId:
          Ref: MyWebLaunchTemplate
        Version: !GetAtt MyWebLaunchTemplate.LatestVersionNumber
      MinSize: 2
      MaxSize: 4
      DesiredCapacity: 4
      TargetGroupARNs:
        - !Ref InternetFacingALBTargetGroup
      Tags:
        - Key: Name
          Value: EC2WebServer
          PropagateAtLaunch: true  
  
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2 security group
      VpcId: !Ref VPC
      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
      Tags:
        - Key: Name
          Value: EC2SecurityGroup

 

  • MyWebServerGroup (오토스케일링 그룹)
    • Type: AWS::AutoScaling::AutoScalingGroup은 동적으로 확장 및 축소할 수 있는 EC2 인스턴스 그룹을 정의합니다.
      • Properties:
        • VPCZoneIdentifier: 오토스케일링 그룹이 배포될 서브넷의 ID 리스트입니다.
        • LaunchTemplate: 인스턴스 생성에 사용될 런치 템플릿의 정보입니다.
        • MinSize, MaxSize, DesiredCapacity: 오토스케일링 그룹의 최소, 최대, 원하는 인스턴스 수입니다.
        • TargetGroupARNs: 오토스케일링 그룹에 연결된 타겟 그룹의 ARN 리스트입니다.
        • Tags: 오토스케일링 그룹 내 인스턴스에 적용될 태그입니다.

EFS 세팅

  MyEFSFileSystem:
    Type: AWS::EFS::FileSystem
    Properties:
      Encrypted: true
      PerformanceMode: generalPurpose
      ThroughputMode: bursting
      FileSystemTags:
        - Key: Name
          Value: MyEFSFileSystem

  MyEFSMountTarget3:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId: !Ref MyEFSFileSystem
      SubnetId: !Ref PrivateSubnet3
      SecurityGroups:
        - !Ref EFSSecurityGroup

  MyEFSMountTarget4:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId: !Ref MyEFSFileSystem
      SubnetId: !Ref PrivateSubnet4
      SecurityGroups:
        - !Ref EFSSecurityGroup

  EFSSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow access to EFS
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 2049
          ToPort: 2049
          CidrIp: 10.10.0.0/22

 

Amazon EFS (Elastic File System)는 AWS에서 제공하는 완전관리형의 확장 가능한 파일 스토리지 서비스입니다. EFS는 간단하고 확장성이 뛰어난 파일 스토리지를 필요로 하는 애플리케이션에 적합합니다.
  • 현재 위의 아키택쳐는 private subnet 3,4에 있는 APP단 오토스케일링 그룹이 EFS를 통해 파일을 공유 하고 있습니다.
  • Type: AWS::EFS::FileSystem 리소스는 Amazon EFS 파일 시스템을 생성합니다.

  • Properties
    • Encrypted: 파일 시스템의 데이터를 암호화할지 여부를 지정합니다. 여기서는 true로 설정되어 있어, 데이터가 암호화됩니다.
    • PerformanceMode: 파일 시스템의 성능 모드를 설정합니다. generalPurpose는 일반적인 용도로 사용되며, 대부분의 워크로드에 적합합니다.
    • ThroughputMode: 처리량 모드를 설정합니다. bursting은 사용량에 따라 자동으로 처리량이 조절되는 모드입니다.
    • FileSystemTags: 파일 시스템에 태그를 추가합니다. 여기서는 이름을 MyEFSFileSystem으로 지정합니다.
    • LifecyclePolices: 위의 코드에는 추가 안했지만 라이프사이클도 추가할 수 있습니다.
      • TransitionToIA: AFTER_30_DAYS : 30일이 지난 후에 IA로 전환 할 수 있습니다.
  • MyEFSMountTarget3 & MyEFSMountTarget4 (EFS 마운트 타겟 생성)
    • Type: AWS::EFS::MountTarget은 EFS 파일 시스템을 EC2 인스턴스에 마운트할 수 있는 타겟을 생성합니다.
      • Properties:
        • FileSystemId: 마운트할 파일 시스템의 ID를 참조합니다.
        • SubnetId: 마운트 타겟이 위치할 서브넷의 ID를 참조합니다. PrivateSubnet3과 PrivateSubnet4에 각각 마운트 타겟을 생성합니다.
        • SecurityGroups: 마운트 타겟에 대한 네트워크 액세스를 허용하는 보안 그룹을 지정합니다.
  • EFSSecurityGroup (보안 그룹 생성)
    • Type: AWS::EC2::SecurityGroup은 인바운드 트래픽 규칙을 통해 EFS 파일 시스템에 대한 접근을 허용하는 보안 그룹을 생성합니다.
      • Properties
        • GroupDescription: 보안 그룹의 설명입니다.
        • VpcId: 보안 그룹이 생성될 VPC의 ID를 참조합니다.
        • SecurityGroupIngress: 보안 그룹에 인바운드 규칙을 추가합니다. 여기서는 TCP 프로토콜 2049 포트(NFS)로의 접근을 허용합니다.

RDS 세팅

  MyDBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MinRDS
      AllocatedStorage: 20
      DBInstanceClass: !Ref DBInstanceClass
      Engine: mysql
      MasterUsername: !Ref MasterUsername
      MasterUserPassword: !Ref MasterUserPassword
      MultiAZ: true
      VPCSecurityGroups:
        - !Ref MyDBSecurityGroup
      DBSubnetGroupName: !Ref MyDBSubnetGroup
    
  MyDBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: My DB Subnet Group
      SubnetIds:
        - !Ref PrivateSubnet3
        - !Ref PrivateSubnet4
        
  MyDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to RDS
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          CidrIp: 10.10.0.0/24
  • MyDBInstance (RDS 데이터베이스 인스턴스)
    • Type: AWS::RDS::DBInstance는 Amazon RDS 데이터베이스 인스턴스를 생성합니다.
    • Properties
      • DBName: 생성될 데이터베이스의 이름입니다.
      • AllocatedStorage: 데이터베이스에 할당될 스토리지 크기(GB)입니다.
      • DBInstanceClass: 데이터베이스 인스턴스 유형입니다. db.t2.small은 인스턴스의 성능을 결정합니다.
      • Engine: 사용될 데이터베이스 엔진입니다. 여기서는 mysql을 사용합니다.
      • MasterUsername와 MasterUserPassword: 데이터베이스의 마스터 사용자 이름과 비밀번호입니다.
      • MultiAZ: 데이터베이스 인스턴스의 고가용성 설정입니다. true로 설정하면, 자동으로 다른 가용 영역에 대기 복제본이 생성됩니다.
      • VPCSecurityGroups: 데이터베이스 인스턴스에 대한 네트워크 접근 제어를 설정하는 VPC 보안 그룹입니다.
      • DBSubnetGroupName: 데이터베이스 인스턴스가 위치할 서브넷 그룹의 이름입니다.
  • MyDBSubnetGroup (RDS 서브넷 그룹)
    • Type: AWS::RDS::DBSubnetGroup는 RDS 데이터베이스 인스턴스를 위한 서브넷 그룹을 생성합니다.
    • Properties:
      • DBSubnetGroupDescription: 서브넷 그룹의 설명입니다.
      • SubnetIds: 서브넷 그룹에 포함될 서브넷의 ID 목록입니다. 여기서는 PrivateSubnet3와 PrivateSubnet4를 참조합니다.
  • MyDBSecurityGroup (RDS 보안 그룹)
    • Type: AWS::EC2::SecurityGroup는 EC2 인스턴스 또는 RDS 인스턴스와 같은 리소스에 대한 인바운드 및 아웃바운드 트래픽을 제어합니다.
    • Properties:
      • GroupDescription: 보안 그룹의 설명입니다.
      • VpcId: 보안 그룹이 위치할 VPC의 ID입니다.
      • SecurityGroupIngress: 인바운드 규칙을 정의합니다. 여기서는 MySQL 데이터베이스의 기본 포트인 3306번 포트로 들어오는 TCP 트래픽을 허용합니다.

ElastiCache 세팅

  MyCacheSubnetGroup:
    Type: AWS::ElastiCache::SubnetGroup
    Properties:
      Description: Cache Subnet Group
      SubnetIds:
        - !Ref PrivateSubnet3

  MyElasticCacheCluster:
    Type: AWS::ElastiCache::CacheCluster
    Properties:
      CacheNodeType: !Ref CacheNodeType
      Engine: redis
      NumCacheNodes: 1
      CacheSubnetGroupName: !Ref MyCacheSubnetGroup
      VpcSecurityGroupIds:
        - !GetAtt MyElasticCacheSecurityGroup.GroupId
        
  MyElasticCacheSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security Group for ElasticCache
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 6379 
          ToPort: 6379
          CidrIp: 10.10.0.0/24
  • MyCacheSubnetGroup (ElastiCache 서브넷 그룹)
    • Type: AWS::ElastiCache::SubnetGroup는 ElastiCache 클러스터를 위한 서브넷 그룹을 생성합니다.
    • Properties
      • Description: 서브넷 그룹에 대한 설명입니다.
      • SubnetIds: 서브넷 그룹에 포함될 서브넷의 ID 목록입니다. 여기서는 PrivateSubnet3를 참조합니다. 이는 ElastiCache 클러스터가 배치될 VPC 내의 특정 서브넷을 지정합니다.

  • MyElasticCacheCluster (ElastiCache 클러스터)
    • Type: AWS::ElastiCache::CacheCluster는 ElastiCache 클러스터를 생성합니다.
    • Properties:
      • CacheNodeType: 사용될 캐시 노드 유형입니다. cache.t2.small은 클러스터에 사용될 인스턴스 유형을 지정합니다.
      • Engine: 캐시 엔진 유형을 지정합니다. 여기서는 redis를 사용합니다.
      • NumCacheNodes: 클러스터에 생성될 캐시 노드의 수입니다. 여기서는 1개의 노드만 생성합니다.
      • CacheSubnetGroupName: 클러스터가 사용할 서브넷 그룹의 이름을 참조합니다. 여기서는 MyCacheSubnetGroup을 사용합니다.
      • VpcSecurityGroupIds: 클러스터에 적용될 보안 그룹의 ID 목록입니다. 여기서는 MyElasticCacheSecurityGroup의 그룹 ID를 참조합니다.
  • MyElasticCacheSecurityGroup (ElastiCache 보안 그룹)
    • Type: AWS::EC2::SecurityGroup는 AWS 리소스에 대한 네트워크 액세스를 제어하는 보안 그룹을 생성합니다.
    • Properties:
      • GroupDescription: 보안 그룹에 대한 설명입니다.
      • VpcId: 보안 그룹이 생성될 VPC의 ID를 참조합니다.
      • SecurityGroupIngress: 인바운드 규칙을 정의합니다. 여기서는 Redis의 기본 포트인 6379번 포트로 TCP 트래픽을 허용합니다. 이는 ElastiCache 클러스터에 대한 액세스를 제어합니다.

Output 설정

Outputs:
  BastionHostPublicIp:
    Description: Public IP address of the bastion host
    Value: !GetAtt BastionHost.PublicIp
  
  InternetFacingALBDNSName:
    Description: The DNS name of the internet-facing load balancer
    Value: !GetAtt MyInternetFacingALB.DNSName
  
  InternelALBDNSName:
    Description: The DNS name of the internel load balancer
    Value: !GetAtt MyInternalALB.DNSName
  
  RDSDBInstanceReadEndpoint:
    Description: The read endpoint of the RDS DB instance (if applicable for read replicas)
    Value: !GetAtt MyDBInstance.Endpoint.Address

  ElastiCacheRedisEndpoint:
    Description: The endpoint of the ElastiCache Redis cluster
    Value: !GetAtt MyElasticCacheCluster.RedisEndpoint.Address
  • 콘솔에서 보고 싶은 내용을 출력할 수 있습니다.
  • 굳이 각각의 서비스에 안 찾아가도 되고 CloudFormation에서 모두 확인할 수 있습니다.

'AWS Cloud School > project' 카테고리의 다른 글

CloudFormation을 TerraForm으로 변경하기  (0) 2024.03.11
CloudFormation 실행하기 및 테스트  (0) 2024.03.11
DMZ 구성  (0) 2024.02.01
CentOS에서 보안 회선 VPN 구성 (실습)  (2) 2024.01.21
'AWS Cloud School/project' 카테고리의 다른 글
  • CloudFormation을 TerraForm으로 변경하기
  • CloudFormation 실행하기 및 테스트
  • DMZ 구성
  • CentOS에서 보안 회선 VPN 구성 (실습)
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    정렬
    linux
    유니온 파인드
    디팬스 게임
    프로그래머스
    이것이 자바다
    스프링 핵심 원리-기본편
    네트워크 기본 용어
    dp
    중첩 선언
    자바
    조합
    VPN
    querydsl
    다이나믹 프로그래밍
    자동 배포
    상속
    쿼드 압축
    백트래킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
CloudFormation을 이용하여 인프라 관리 Yaml 파일 생성
상단으로

티스토리툴바