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
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바