AWS
  • About
  • 수업준비
    • AWS 환경설정
  • 1주차 - EC2
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 2주차 - ELB & Autoscaling
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 3주차 - VPC
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 4주차 - Database
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 5주차 - Storage
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 6주차 - IAM & Security
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 7주차 - Monitoring & Ops
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 8주차 - DevOps
    • 예습
    • 실습
    • 과제
  • EKS
    • 실습
    • 실습 (AWS Worshop Studio)
  • Serverless
    • 실습
  • FAQ
  • Archive
    • AWS CodeBuild로 애플리케이션 테스트 자동화 시스템 구축
    • AWS CodeDeploy로 애플리케이션 배포 자동화 시스템 구축
      • 배포 실패 수정 방법
Powered by GitBook
On this page
  • CloudWatch Logs
  • CloudWatch Metric
  • Amazon EventBridge로 오토스케일링 이벤트 메시지 Slack으로 보내기
  • Port Forwarding으로 로컬에서 프라이빗 서브넷에 있는 RDS 접속하기
  • AWS Config로 SSH 접근 제한
  • CloudTrail 로그 분석 (수정중)

Was this helpful?

  1. 7주차 - Monitoring & Ops

실습

Previous예습NextAWS Skill Builder

Last updated 2 years ago

Was this helpful?

CloudWatch Logs

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

    cdk deploy cw-log
  2. Outputs에서 인스턴스의 퍼블릭 IP, 인스턴스 ID, 웹서버 에러 경로 및 람다 함수 이름을 확인할 수 있습니다.

  3. 웹 브라우저에서 인스턴스의 퍼블릭 IP 주소로 접속하면 한참이 지난후 500 Internal Server Error가 발생합니다.

  4. AWS Systems Manager Session Manager를 통해서 웹서버 인스턴스에 접속해서 아파치 에러 로그 /var/log/httpd/error_log 를 확인 후 원인을 파악해서 고치세요. 소스코드에는 문제가 없습니다.

  5. 해당 를 참고해서 CloudWatch Logs Agent를 설치하고 아파치 에러 로그 /var/log/httpd/error_log를 CloudWatch Logs로 전송하세요.

  6. 웹서버의 에러 경로로 접속하면 인위적으로 에러를 발생시킵니다. 웹 브라우저에서 웹서버 에러 경로로 접속해서 에러를 발생시키고 위에서 생성한 Log Stream에 에러로그가 추가되는지 확인하세요.

  7. psycopg2.OperationalError 에러가 발생하면 실시간으로 이메일 알람을 받으려고 합니다.

    • SNS 토픽을 생성하고 이메일 구독을 생성하세요.

    • 람다 함수 설정에서 환경변수 SNS_ARN 값에 위에서 만든 SNS 토픽 ARN 값을 넣으세요.

    • 아파치 에러 로그가 전송되는 로그그룹에 람다 구독 필터를 생성해서 psycopg2.OperationalError 에러가 발생하면 람다 함수를 호출하도록 설정하세요.

  8. 웹 브라우저에서 웹서버 에러 경로로 접속해서 에러를 발생시키고 이메일로 알림이 오는지 확인하세요.

  9. Sentry를 통해서 이슈 트래킹을 구성하세요.(Optional)

    • 무료 계정을 생성하세요.

    • 새로운 Flask 프로젝트를 생성하세요.

    • pip이 아닌 pip3 명령어로 Sentry 라이브러리를 설치하세요.

    • /var/www/html/app.py에 Sentry 코드를 추가하세요.

    • systemctl restart httpd 명령어로 아파치 웹 서버를 재시작 하세요.

  10. 웹 브라우저에서 웹서버 에러 경로로 접속해서 에러를 발생시키고 Senty 프로젝트에 새로운 이슈가 추가되는지 확인하세요.

  11. 수동으로 수정한 설정들이나(보안그룹 룰, etc) 추가로 생성된 로그 그룹을 삭제하고 CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy cw-log

CloudWatch Metric

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

    cdk deploy cw-metric
  2. AWS Systems Manager Session Manager를 통해서 EC2 인스턴스에 접속을 시도하면 EC2 인스턴스 디스크 볼륨에 여유공간이 없어서 접속이 되지 않습니다.

  3. AWS Systems Manager Run Command를 통해서 해당 인스턴스의 /tmp 디렉토리에 있는 모든 파일을 삭제하세요.

    • AWS-RunShellScript 문서를 사용하세요.

    • 현재 디렉토리의 모든 파일을 삭제하는 리눅스 명령어는 rm -r * 입니다.

    • 만약 RunCommand가 No space left on device 에러 때문에 실패하거나 에러 로그 없이 실패한다면 EC2 인스턴스를 재부팅 후 다시 시도하세요.

  4. AWS Systems Manager Session Manager를 통해서 EC2 인스턴스에 접속하세요.

  5. CloudWatch Metrics에서 CWAgent 네임스페이스에서 디스크 사용량 지표를 확인하세요

  6. 루트 경로의 디스크 사용량이 80% 이상일때 이메일을 통해서 알림을 받고자 합니다. CloudWatch Alarms와 SNS를 이용해서 구성하세요.

  7. EC2 인스턴스에서 아래의 명령어로 디스크 사용량을 인위적으로 100%로 만들고 이메일 알림이 오는지 확인하세요.

    fallocate -l $(($(df / | tail -1 | tr -s ' ' | cut -d' ' -f4) * 999)) /tmp/file
  8. 수동으로 생성한 CloudWatch Alarm이나 IAM 역할에 추가한 정책들을 삭제하고 CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy cw-metric

Amazon EventBridge로 오토스케일링 이벤트 메시지 Slack으로 보내기

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

    cdk deploy cw-event
  2. Outputs에서 오토스케일링 그룹 이름 및 람다 함수 이름을 확인할 수 있습니다.

  3. Amazon EventBridge에서 아래와 같은 규칙을 생성하세요.

    Type

    Event pattern

    Event matching pattern

    Pre-defined pattern by service

    Service provider

    AWS

    Service name

    Auto Scaling

    Event type

    Instance Launch and Terminate

    Target

    Outputs에 나온 람다 함수

  4. 람다 함수 설정에서 환경변수 SLACK_CHANNEL과 WEBHOOK_URL 값에 위에서 만든 값들을 넣으세요.

  5. 오토스케일링그룹의 최소 용량을 2로 수정해서 인스턴스 갯수를 수동으로 조정하고 위에서 지정한 Slack 채널로 메시지가 오는지 확인하세요.

  6. 수동으로 생성한 EventBridge 규칙을 삭제하고 CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy cw-event

Port Forwarding으로 로컬에서 프라이빗 서브넷에 있는 RDS 접속하기

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

    cdk deploy port-forwarding
  2. Outputs에서 Bastion 호스트 ID 및 RDS 접속 정보가 저장된 Secret 이름을 확인할 수 있습니다.

  3. Secrets Manager에서 Outputs에 나온 RDS 접속 정보가 저장된 Secret의 값을 불러와서 DB 접속정보를 찾습니다

  4. AWS Systems Manager Session Manager를 통해서 Bastion 호스트에 접속하세요.

  5. 아래와 같은 명령어를 통해서 포트포워딩을 설정하세요. -

    • socat 및 mysql 설치

      sudo yum install -y socat
    • RDS로 포트포워딩 설정 - MYSQLEndpoint에 Secrets Manager를 통해서 확인한 RDS 엔드포인트 입력

      export MYSQLEndpoint=
      
      sudo socat TCP-LISTEN:3306,reuseaddr,fork TCP4:$MYSQLEndpoint &
  6. AWS CLI 명령어로 Bastion 호스트로 세션을 생성 - INSTANCE_ID에 Outputs에 나온 Bastion 호스트 ID 입력

    export INSTANCE_ID=
    
    aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["3306"], "localPortNumber":["3306"]}'
  7. 새로운 터미널을 열고 아래와 같은 명령어로 MySQL 서버에 접속 - RDS 어드민 유저의 비밀번호는 3번 단계에서 확인

    mysql --host=127.0.0.1 --port=3306 -u admin -p
  8. CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy port-forwarding

AWS Config로 SSH 접근 제한

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

    cdk deploy config
  2. AWS Config를 활성화 하세요.

  3. AWS managed rules에서 restricted-ssh 규칙을 추가하세요.

  4. 위에서 생성한 규칙에 아래와 같은 remediation을 추가하세요.

    Method

    Automatic remediation

    Action

    AWS-DisablePublicAccessForSecurityGroup

    Resource ID parameter

    GroupId

    AutomationAssumeRole

    Outputs에 나온 AutomationRoleArn

  5. 아래와 같은 인바운드 규칙을 가진 보안그룹을 생성하세요.

    Type

    SSH

    Source

    Anywhere

  6. 보안그룹 생성 후 5 - 10분쯤 지나면 인바운드 규칙이 삭제된 것을 확인할수 있습니다. 만약 인바운드 규칙이 삭제되지 않았다면 AWS Systems Manager Automation에서 Automation 실행 내역을 확인하세요.

  7. 수동으로 생성한 AWS Config 규칙과 보안그룹을 삭제, AWS Confg 레코딩을 비활성화 하고 CDK를 통해서 실습 환경을 삭제하세요.

    cdk destroy config

CloudTrail 로그 분석 (수정중)

  1. Amazon Athena에서 아래와 같은 쿼리를 실행해서 테이블을 생성하세요.

    CREATE EXTERNAL TABLE cloudtrail_logs (
    eventversion STRING,
    useridentity STRUCT<
                   type:STRING,
                   principalid:STRING,
                   arn:STRING,
                   accountid:STRING,
                   invokedby:STRING,
                   accesskeyid:STRING,
                   userName:STRING,
    sessioncontext:STRUCT<
    attributes:STRUCT<
                   mfaauthenticated:STRING,
                   creationdate:STRING>,
    sessionissuer:STRUCT<  
                   type:STRING,
                   principalId:STRING,
                   arn:STRING, 
                   accountId:STRING,
                   userName:STRING>>>,
    eventtime STRING,
    eventsource STRING,
    eventname STRING,
    awsregion STRING,
    sourceipaddress STRING,
    useragent STRING,
    errorcode STRING,
    errormessage STRING,
    requestparameters STRING,
    responseelements STRING,
    additionaleventdata STRING,
    requestid STRING,
    eventid STRING,
    resources ARRAY<STRUCT<
                   ARN:STRING,
                   accountId:STRING,
                   type:STRING>>,
    eventtype STRING,
    apiversion STRING,
    readonly STRING,
    recipientaccountid STRING,
    serviceeventdetails STRING,
    sharedeventid STRING,
    vpcendpointid STRING
    )
    ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
    STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION 's3://week7-cloudtrail-lab/';
  2. 다수의 개발자들이 해커톤에 참석했었는데 실수로 AWS 엑세스키가 포함됨 코드를 퍼블릭 Git 리포지토리에 올렸다고 합니다. 다행히 개발자들의 IAM 유저가 소속되어 있는 IAM 그룹에는 회사 IP주소(124.50.148.92)가 아닐 경우에는 모든 API를 거부하는 정책이 포함되어 있습니다. CloudTrail 로그를 분석해서 어떤 유저의 키로부터 비정상적인 API 호출이 있었는지 확인하세요.

  3. daniel 이라는 IAM 유저를 사용하는 개발자가 AWS 콘솔에 접속할때 비밀번호가 틀리다고 접속이 안된다고 합니다. 비밀번호 변경은 관리자 그룹에 있는 유저만 가능한데 어떤 이유인지 확인하세요.

  4. jack 이라는 IAM 유저를 사용하는 개발자가 배치작업을 위해서 3개의 인스턴스를 생성했는데 그중 한개의 인스턴스가 갑자기 중지(Terminate) 됬다고 합니다. 어떤 이유인지 확인하세요.

해당 를 참고해서 CloudWatch Agent를 설치하세요.

해당 를 참고해서 디스크 사용량 지표를 포함하는 CloudWatch Agent 설정 파일을 생성하세요.

해당 를 참고해서 위에서 생성한 설정파일로 CloudWatch Agent를 구동하세요.

만약 CWAgent 네임스페이스나 그 안에 지표가 안보인다면 EC2 인스턴스에서 CloudWatch Agent 로그를 /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log 확인하고 권한 에러가 있을 경우에는 EC2 인스턴스의 IAM 역할에 적절한 을 부여하세요.

해당 를 통해서 알림을 받을 Slack 채널을 지정하고 Webhook URL을 생성하세요.

Cloud9 인스턴스에 접속 후 해당 를 참고해서 Session Manager 플러그인을 설치하세요.

문서
문서
문서
권한
링크
문서
문서
Senty