실습

웹서버에 HTTPS 적용하기

  1. CDK를 통해서 실습 환경을 구축하세요.(도메인 이름과 호스팅 영역 ID는 Route53 - Hosted zones에서 확인 가능)

    cdk deploy ssl --parameters domainName=DOMAIN_NAME --parameters hostedZoneId=HOSTED_ZONE_ID --parameters keyPair=KEYPAIR_NAME
  2. Outputs에서 인스턴스 ID 및 해당 인스턴스에 설치된 웹서버와 연동된 도메인 주소를 확인할 수 있습니다.

  3. Outputs에서 나온 URL로 접속해서 정상 작동하는지 확인합니다.

  4. 해당 웹페이지비디오를 참고해서 HTTPS을 적용하세요. 해당 웹사이트에 적용된 아파치 설정 파일은 /etc/httpd/conf.d/app.conf 입니다. HTTPS 적용 후 사이트 접속이 안될 경우에는 EC2 인스턴스에 부여된 보안그룹을 확인하세요.

  5. Certbot으로 SSL인증서를 설치한 후에 HTTPS로만 연결이 됩니다. 그 이유를 찾고 HTTP로도 연결이 되도록 아파치 설정 파일을 수정하세요.

  6. HTTP 연결 설정을 한 후에도 지속적으로 HTTPS로 연결될 경우에는 브라우저 캐시 때문이므로 다른 브라우저에서 테스트를 하거나 cURL 명령어로 웹서버와 연동된 도메인 주소로 접속이 되는지 확인합니다.

  7. CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy ssl

로드밸런서로 HTTPS 적용하기

  1. CDK를 통해서 실습 환경을 구축하세요.(도메인 이름과 호스팅 영역 ID는 Route53 - Hosted zones에서 확인 가능)

    cdk deploy elb --parameters domainName=DOMAIN_NAME --parameters hostedZoneId=HOSTED_ZONE_ID --parameters keyPair=KEYPAIR_NAME
  2. Outputs에서 인스턴스 ID, ALB 이름 및 ALB와 연동된 도메인 주소를 확인할 수 있습니다.

  3. Outputs에서 나온 URL로 접속해서 정상 작동하는지 확인합니다.

  4. AWS Certificate Manager에서 DNS Validation을 통해서 SSL 인증서를 발급받으세요.

  5. 어플리케이션 로드밸런서에 HTTPS 리스너를 추가하세요.

  6. HTTP 요청을 HTTPS로 리다이렉션하는 HTTP 리스너 규칙을 생성하세요.

  7. EC2 인스턴스에 SSH 접속을 해서 아파치 엑세스 로그 /var/log/httpd/access_log 를 보면 (ELB-HealthChecker/2.0는 제외) 요청자 IP 주소가 본인의 IP 주소와 다른것을 알수 있습니다. 그 원인에 대해서 설명하고 로그에 실제 요청자의 IP 주소가 남도록 수정하세요.

  8. CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy elb

경로기반 라우팅 설정

  1. CDK를 통해서 실습 환경을 구축하세요.

    cdk deploy color --parameters domainName=DOMAIN_NAME --parameters hostedZoneId=HOSTED_ZONE_ID
  2. Outputs에서 인스턴스 ID, ALB 이름 및 ALB와 연동된 도메인 주소을 확인할 수 있습니다.

  3. Outputs에서 나온 사이트 주소로 접속하면 파랑 배경 페이지와 녹색 배경 페이지가 번갈아 가면서 표시됩니다. blue_instance는 파랑 배경 페이지를 green_instance는 녹색 배경 페이지를 전달합니다. 어플리케이션 로드 밸런서에 경로 기반 라우팅을 추가해서 /blue 는 파랑 배경 페이지가 보이고, /green은 녹색 배경 페이지가 보이도록 설정하세요.

  4. 수동으로 생성한 리소스들을 삭제하세요.

  5. CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy color

확장가능한 웹서비스 구축

  1. IAM 역할 생성

    {
    cat > trust-policy.json <<EOF
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "ec2.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    EOF
    aws iam create-role --role-name week2-asg-lab-role \
    --assume-role-policy-document file://trust-policy.json \
    --no-cli-pager
    
    aws iam attach-role-policy --role-name week2-asg-lab-role \
    --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore \
    --no-cli-pager
    
    aws iam create-instance-profile \
    --instance-profile-name week2-asg-lab-role \
    --no-cli-pager
    
    aws iam add-role-to-instance-profile \
    --instance-profile-name week2-asg-lab-role \
    --role-name week2-asg-lab-role \
    --no-cli-pager
    }
  2. 아래와 같은 구성으로 시작 템플릿 생성하세요.

    AMI

    Amazon Linux 2023

    Instance Type

    m5.large

    Keypair

    인스턴스 접속에 사용할 키페어

    IAM instance profile

    week2-asg-lab-role

    Userdata

    아래의 스크립트

    Tag

    Key=Ec2StressCpu Value=Allowed

    #!/bin/bash
    
    TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
    && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
    
    PUBLIC_IP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/public-ipv4 )
    AZ=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
    AZ_CODE="${AZ: -1}"
    
    if [ $AZ_CODE = "a" ]
    then
      echo "<style>body {background-color: red}</style>" > /tmp/index.html
    elif [ $AZ_CODE = "b" ]
    then
      echo "<style>body {background-color: blue}</style>" > /tmp/index.html
    elif [ $AZ_CODE = "c" ]
    then
      echo "<style>body {background-color: orange}</style>" > /tmp/index.html
    else
      echo "<style>body {background-color: green}</style>" > /tmp/index.html
    fi
    
    echo "<h1>Availability Zone: $AZ</h1>" >> /tmp/index.html
    echo "<h1>Public IP: $PUBLIC_IP</h1>" >> /tmp/index.html
    
    yum update -y
    yum install -y httpd
    mv /tmp/index.html /var/www/html/
    
    systemctl enable httpd
    systemctl start httpd
  3. 위에서 생성한 시작 템플릿으로 아래와 같은 구성의 오토스케일링 그룹을 생성하세요.

    Auto Scaling Group Name

    원하는 값을 입력

    Launch Template

    위에서 생성한 시작 템플릿

    VPC

    Default

    Subnets

    모든 서브넷 선택

    Health Check Grace Period

    60 seconds

    Desired Capacity

    1

    Minimum Capacity

    1

    Maximum Capacity

    2

    Scaling Policy

    Target Tracking Scaling Policy

    Metric type

    Average CPU Utilization

    Target Value

    50

  4. 아래와 같은 구성의 대상 그룹을 생성하세요.

    Target Type

    Instances

    Target Group Name

    원하는 값을 입력

    VPC

    Default

  5. 생성된 대상그룹 속성에서 Deregistration Delay60초로 수정합니다.

  6. 오토 스케일링 그룹과 대상 그룹을 연동해서 오토 스케일링 그룹을 통해서 생성되는 인스턴스가 자동으로 대상 그룹의 타켓으로 등록되도록 하세요.

  7. 아래와 같은 구성의 로드 밸런서를 생성하세요.

    Load Balancer Type

    Application Load Balancer

    Load Balancer Name

    원하는 값을 입력

    Schema

    Internet-facing

    IP Address Type

    IPv4

    VPC

    Default

    Subnet Mappings

    모든 서브넷 선택

    Listener HTTP:80

    위에서 생성한 대상그룹으로 포워딩

  8. 생성된 로드밸런서 DNS 주소로 접속해서 정상 작동하는지 확인하고, 접속이 안될 경우 원인을 파악해서 수정하세요.

  9. Route53에서 Alias 레코드를 생성해서 로드밸런서에 연결하세요.

  10. 로드밸런서에 HTTPS 리스너를 추가하고 HTTP 연결을 HTTPS로 리다이렉션하는 설정을 추가하세요.

부하테스트 1

  1. 해당 문서를 참고해서 아래의 내용을 수행하세요.

  2. AWS FIS 서비스의 Scenario Library의 EC2 Stress: CPU로 새로운 Experiment Template을 생성하세요.

  3. 위에서 생성한 Template으로 오토스케일링 그룹에 포함되는 인스턴스에 CPU 부하를 생성하세요.

  4. 오토스케일링 그룹이 새로운 인스턴스를 추가했는지 확인하고 브라우저에서 웹사이트로 접속해서 페이지를 리프레시 하면서 로드밸런서가 두개의 서버로 트래픽을 분산시키는지 확인합니다.

  5. 오토스케일링 그룹에서 Desired Capacity를 1로 수정해서 인스턴스 갯수를 수동으로 축소합니다.

  6. 수동으로 인스턴스 갯수를 축소시켰는데 인스턴스가 바로 삭제되지 않습니다. 오토스케일링 그룹의 Activity 섹션이나 대상그룹의 Target 섹션을 참고해서 그 이유를 설명하세요.

어플리케이션 업데이트

  1. 오토스케일링 그룹에서 Desired Capacity2로, Minimum Capacity2로, Maximum Capacity4로 수정하고 브라우저에서 웹사이트로 접속해서 새로운 서버가 정상적으로 생성됐는지 확인합니다.

  2. Userdata를 아래와 같이 수정해서 시작템플릿에 새 버전을 생성하세요. 새로운 시작템플릿을 생성하지 말고 기존에 생성한 시작템플릿에 새버전을 추가합니다.

    #!/bin/bash
    
    yum install -y httpd git
    git clone https://github.com/youngwjung/static-html-sample.git /var/www/html/
    systemctl enable httpd
    systemctl start httpd
  3. 오토스케일링 그룹에 새로 생성한 버전의 시작 템플릿을 적용하고 Instance Refresh 기능을 통해서 새버전을 롤링 업데이트 합니다.

  4. 롤링업데이트가 실행되는 중간에 순간적으로 1대의 인스턴스만 트래픽을 처리합니다. 그 이유에 대해서 설명하세요.

  5. 만약 항상 최소한 2대의 인스턴스가 트래픽을 처리하도록 하면서 어플리케이션 업데이트를 수행해야 한다면 어떤 방법이 있는지 설명하세요.

Auto Healing

  1. 오토스케일링 그룹에서 Desired Capacity1로, Minimum Capacity1로, Maximum Capacity4로 수정하고 인스턴스 갯수가 1개가 될때까지 기다리세요.

  2. 남은 인스턴스를 수동으로 정지(Stop) 합니다.

  3. 일정 시간이 지나면 오토스케일링 그룹이 정지된 인스턴스를 삭제하고 새로운 인스턴스를 생성합니다. 그 이유에 대해서 설명하세요.

  4. 새로 생성된 인스턴스에 SSH 접속을 해서 아래의 명령어로 아파치 웹서버를 중지합니다.

    sudo systemctl stop httpd
  5. 일정 시간이 지나도 오토스케일링 그룹이 아파치 서버가 정지된 인스턴스를 삭제하지도 않고 새로운 인스턴스를 생성하지도 않는다면 그 이유에 대해서 설명하세요.

  6. 오토스케일링 그룹 설정을 변경해서 아파치 웹서버를 중지한 인스턴스가 새로운 인스턴스로 교체되도록 구성하세요.

오토스케일링 그룹 장애 해결

  1. CDK를 통해서 실습 환경을 구축하세요.

    cdk deploy asg
  2. Outputs에서 오토스케일링 그룹 이름, ALB 이름 및 ALB와 연동된 도메인 주소을 확인할 수 있습니다.

  3. Outputs에서 나온 URL로 접속해서 정상 작동하는지 확인합니다.

  4. 오토스케일링 그룹을 통해서 생성되는 인스턴스들이 지속적으로 생성 및 삭제됩니다. 인스턴스에 SSH 접속을 하지 말고 오토스케일링 그룹 시작구성에서 그 원인을 찾아서 오토스케일링 그룹 설정 변경을 통해서 문제를 해결하세요.

  5. 오토스케일링 그룹의 설정값중에 Cooldown Period는 어떤 경우에 적용되는지 설명하세요.

  6. CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy asg

부하테스트 2 (Optional)

  1. 오토스케일링 그룹의 조정 정책에서 초기에 생성한 대상 추적 조정 정책을 삭제합니다.

  2. CloudWatch에서 다음과 같은 알람을 생성합니다.

    • 어플리케이션 로드 밸런서의 1분간의 요청수(RequestCount)의 합(Sum)이 3번 연속으로 1000이 넘을 경우

    • 어플리케이션 로드 밸런서의 1분간의 요청수(RequestCount)의 합(Sum)이 3번 연속으로 100보다 작을 경우

  3. 오토스케일링 그룹의 조정 정책에 첫번째 알람(RequestCount > 1000)이 발생할 경우 1개의 인스턴스를 추가하는 정책을 생성하고 두번째 알람(RequestCount < 100)이 발생할 경우 1개의 인스턴스를 삭제하는 정책을 생성하세요.

  4. 새로운 EC2 인스턴스를 생성하고 아래의 명령어를 차례로 실행해서 Locust를 구성합니다.

    ## 1. Install python and required libraries
    sudo yum install -y python3 python3-devel gcc
    sudo pip3 install locust
    
    ## 2. Create a locustfile
    cat <<EOF >> locust.py
    import time
    from locust import HttpUser, task
    
    class Zombie(HttpUser):
        @task
        def index(self):
            self.client.get("/")
    EOF
    
    ## 3. Start Locust
    locust -f locust.py
  5. 웹브라우저에서 HTTP://인스턴스_공인_IP:8089 로 접속해서 Locust 웹 인터페이스를 실행합니다.

  6. 아래와 같은 설정하고 Start swarming 버튼을 눌러서 로드 테스트를 진행합니다.

    • Number of total users to simulate: 100

    • Spawn rate: 100

    • Host: 웹서버 DNS 주소

  7. 로드밸런서 모니터링 탭에서 RequestCount 지표의 값이 올라가는 확인합니다.

  8. 오토스케일링 그룹이 새로운 인스턴스를 생성하는지 확인합니다.

  9. 어플리케이션 로드 밸런서의 RequestCount 지표는 오토스케일링을 정하는 지표로 좋은 선택이 아닙니다. 그 이유를 설명하고 어플리케이션 로드 밸런서의 지표중에서 어떤 지표가 스케일링 인/아웃을 정하는 지표로 좋은지 찾고 그 이유를 설명하세요.

  10. 오토스케일링 그룹, 어플리케이션 로드밸런서 및 Locust를 설치한 EC2 인스턴스를 삭제하세요.

Last updated