실습
Last updated
Last updated
CDK를 통해서 실습 환경을 구축하세요.
Outputs에서 인스턴스의 퍼블릭 IP, 인스턴스 ID, 웹서버 에러 경로 및 람다 함수 이름을 확인할 수 있습니다.
웹 브라우저에서 인스턴스의 퍼블릭 IP 주소로 접속하면 한참이 지난후 500 Internal Server Error가 발생합니다.
AWS Systems Manager Session Manager를 통해서 웹서버 인스턴스에 접속해서 아파치 에러 로그 /var/log/httpd/error_log 를 확인 후 원인을 파악해서 고치세요. 소스코드에는 문제가 없습니다.
해당 문서를 참고해서 CloudWatch Logs Agent를 설치하고 아파치 에러 로그 /var/log/httpd/error_log를 CloudWatch Logs로 전송하세요.
웹서버의 에러 경로로 접속하면 인위적으로 에러를 발생시킵니다. 웹 브라우저에서 웹서버 에러 경로로 접속해서 에러를 발생시키고 위에서 생성한 Log Stream에 에러로그가 추가되는지 확인하세요.
psycopg2.OperationalError 에러가 발생하면 실시간으로 이메일 알람을 받으려고 합니다.
SNS 토픽을 생성하고 이메일 구독을 생성하세요.
람다 함수 설정에서 환경변수 SNS_ARN 값에 위에서 만든 SNS 토픽 ARN 값을 넣으세요.
아파치 에러 로그가 전송되는 로그그룹에 람다 구독 필터를 생성해서 psycopg2.OperationalError 에러가 발생하면 람다 함수를 호출하도록 설정하세요.
웹 브라우저에서 웹서버 에러 경로로 접속해서 에러를 발생시키고 이메일로 알림이 오는지 확인하세요.
Sentry를 통해서 이슈 트래킹을 구성하세요.(Optional)
Senty 무료 계정을 생성하세요.
새로운 Flask 프로젝트를 생성하세요.
pip이 아닌 pip3 명령어로 Sentry 라이브러리를 설치하세요.
/var/www/html/app.py에 Sentry 코드를 추가하세요.
systemctl restart httpd 명령어로 아파치 웹 서버를 재시작 하세요.
웹 브라우저에서 웹서버 에러 경로로 접속해서 에러를 발생시키고 Senty 프로젝트에 새로운 이슈가 추가되는지 확인하세요.
수동으로 수정한 설정들이나(보안그룹 룰, etc) 추가로 생성된 로그 그룹을 삭제하고 CDK를 통해서 실습 환경을 삭제하세요.
CDK를 통해서 실습 환경을 구축하세요.
AWS Systems Manager Session Manager를 통해서 EC2 인스턴스에 접속을 시도하면 EC2 인스턴스 디스크 볼륨에 여유공간이 없어서 접속이 되지 않습니다.
AWS Systems Manager Run Command를 통해서 해당 인스턴스의 /tmp 디렉토리에 있는 모든 파일을 삭제하세요.
AWS-RunShellScript 문서를 사용하세요.
현재 디렉토리의 모든 파일을 삭제하는 리눅스 명령어는 rm -r * 입니다.
만약 RunCommand가 No space left on device 에러 때문에 실패하거나 에러 로그 없이 실패한다면 EC2 인스턴스를 재부팅 후 다시 시도하세요.
AWS Systems Manager Session Manager를 통해서 EC2 인스턴스에 접속하세요.
해당 문서를 참고해서 CloudWatch Agent를 설치하세요.
해당 문서를 참고해서 디스크 사용량 지표를 포함하는 CloudWatch Agent 설정 파일을 생성하세요.
해당 문서를 참고해서 위에서 생성한 설정파일로 CloudWatch Agent를 구동하세요.
CloudWatch Metrics에서 CWAgent 네임스페이스에서 디스크 사용량 지표를 확인하세요
만약 CWAgent 네임스페이스나 그 안에 지표가 안보인다면 EC2 인스턴스에서 CloudWatch Agent 로그를 /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log 확인하고 권한 에러가 있을 경우에는 EC2 인스턴스의 IAM 역할에 적절한 권한을 부여하세요.
루트 경로의 디스크 사용량이 80% 이상일때 이메일을 통해서 알림을 받고자 합니다. CloudWatch Alarms와 SNS를 이용해서 구성하세요.
EC2 인스턴스에서 아래의 명령어로 디스크 사용량을 인위적으로 100%로 만들고 이메일 알림이 오는지 확인하세요.
수동으로 생성한 CloudWatch Alarm이나 IAM 역할에 추가한 정책들을 삭제하고 CDK를 통해서 실습 환경을 삭제하세요.
CDK를 통해서 실습 환경을 구축하세요.
Outputs에서 오토스케일링 그룹 이름 및 람다 함수 이름을 확인할 수 있습니다.
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에 나온 람다 함수
해당 링크를 통해서 알림을 받을 Slack 채널을 지정하고 Webhook URL을 생성하세요.
람다 함수 설정에서 환경변수 SLACK_CHANNEL과 WEBHOOK_URL 값에 위에서 만든 값들을 넣으세요.
오토스케일링그룹의 최소 용량을 2로 수정해서 인스턴스 갯수를 수동으로 조정하고 위에서 지정한 Slack 채널로 메시지가 오는지 확인하세요.
수동으로 생성한 EventBridge 규칙을 삭제하고 CDK를 통해서 실습 환경을 삭제하세요.
CDK를 통해서 실습 환경을 구축하세요.
Outputs에서 Bastion 호스트 ID 및 RDS 접속 정보가 저장된 Secret 이름을 확인할 수 있습니다.
Secrets Manager에서 Outputs에 나온 RDS 접속 정보가 저장된 Secret의 값을 불러와서 DB 접속정보를 찾습니다
AWS Systems Manager Session Manager를 통해서 Bastion 호스트에 접속하세요.
아래와 같은 명령어를 통해서 포트포워딩을 설정하세요. -
socat 및 mysql 설치
RDS로 포트포워딩 설정 - MYSQLEndpoint에 Secrets Manager를 통해서 확인한 RDS 엔드포인트 입력
Cloud9 인스턴스에 접속 후 해당 문서를 참고해서 Session Manager 플러그인을 설치하세요.
AWS CLI 명령어로 Bastion 호스트로 세션을 생성 - INSTANCE_ID에 Outputs에 나온 Bastion 호스트 ID 입력
새로운 터미널을 열고 아래와 같은 명령어로 MySQL 서버에 접속 - RDS 어드민 유저의 비밀번호는 3번 단계에서 확인
CDK를 통해서 실습 환경을 삭제하세요.
CDK를 통해서 실습환경을 구축하세요.
AWS Config를 활성화 하세요.
AWS managed rules에서 restricted-ssh 규칙을 추가하세요.
위에서 생성한 규칙에 아래와 같은 remediation을 추가하세요.
Method
Automatic remediation
Action
AWS-DisablePublicAccessForSecurityGroup
Resource ID parameter
GroupId
AutomationAssumeRole
Outputs에 나온 AutomationRoleArn
아래와 같은 인바운드 규칙을 가진 보안그룹을 생성하세요.
Type
SSH
Source
Anywhere
보안그룹 생성 후 5 - 10분쯤 지나면 인바운드 규칙이 삭제된 것을 확인할수 있습니다. 만약 인바운드 규칙이 삭제되지 않았다면 AWS Systems Manager Automation에서 Automation 실행 내역을 확인하세요.
수동으로 생성한 AWS Config 규칙과 보안그룹을 삭제, AWS Confg 레코딩을 비활성화 하고 CDK를 통해서 실습 환경을 삭제하세요.
Amazon Athena에서 아래와 같은 쿼리를 실행해서 테이블을 생성하세요.
다수의 개발자들이 해커톤에 참석했었는데 실수로 AWS 엑세스키가 포함됨 코드를 퍼블릭 Git 리포지토리에 올렸다고 합니다. 다행히 개발자들의 IAM 유저가 소속되어 있는 IAM 그룹에는 회사 IP주소(124.50.148.92)가 아닐 경우에는 모든 API를 거부하는 정책이 포함되어 있습니다. CloudTrail 로그를 분석해서 어떤 유저의 키로부터 비정상적인 API 호출이 있었는지 확인하세요.
daniel 이라는 IAM 유저를 사용하는 개발자가 AWS 콘솔에 접속할때 비밀번호가 틀리다고 접속이 안된다고 합니다. 비밀번호 변경은 관리자 그룹에 있는 유저만 가능한데 어떤 이유인지 확인하세요.
jack 이라는 IAM 유저를 사용하는 개발자가 배치작업을 위해서 3개의 인스턴스를 생성했는데 그중 한개의 인스턴스가 갑자기 중지(Terminate) 됬다고 합니다. 어떤 이유인지 확인하세요.