7월 1일 회의 내용
API Gateway 도메인 및 역할 추가
WAF (Web Application Firewall)
AWS AMI (Amazon Machine Image)
베이스 이미지(골드 이미지)를 사용하여 클라우드 에이전트 자동화
Packer를 이용하여 Ansible을 대체하는 방식 검토
Amazon Athena
시연 시 인스턴스 관리
시연 시 인스턴스 증설 및 감설에 대한 특정 시간 주의
CPU 부하를 모니터링하는 알람 설정
ECS 또는 EKS
CI/CD 자동 배포
알람 설정
VPC 구성
AWS 인스펙터 및 시스템스 매니저
AWS 인스펙터를 통한 EC2 취약점 점검
AWS 시스템스 매니저를 통해 Ansible 자동화 가능성 검토
시작 템플릿 설정
추가 프로젝트
쿠버네티스 오케스트레이션
현재 구성된 환경을 카펜터 및 쿠버네티스를 통해 오케스트레이션
CKA(쿠버네티스 관리자 자격증) 획득을 통한 쿠버네티스 이해 및 진행
서비스 추가 작업 및 이메일 개선
로그 그룹 분석
AWS AMI (Amazon Machine Image)
베이스 이미지(골드 이미지)를 사용하여 클라우드 에이전트 자동화
Packer를 이용하여 Ansible을 대체하는 방식 검토
API Gateway 도메인 및 역할 추가
API Gateway에 도메인과 역할을 추가하고, dynamic inventory 설정 자동화 필요( 인스턴스 생성 시 IP를 자동으로 등록 )
terraform을 통해 역할 부여
AWS 인스펙터 및 시스템스 매니저
AWS 인스펙터를 통한 EC2 취약점 점검
AWS 시스템스 매니저를 통해 Ansible 자동화 가능성 검토
WAF (Web Application Firewall)
Amazon Athena
VPC 구성
dynamodb 역할을 인스턴스에 부여하면 aws CLI 계정인증 없이 dynamodb 접근 가능
마찬가지로 s3로 가능
s3에 저장하는 데이터: 주로 item ( 이미지, 동영상 ... ),
dynamodb에 저장하는 데이터: 주로 url
베이스 이미지(골드 이미지)를 사용하여 클라우드 에이전트 자동화
( Packer를 이용하여 Ansible을 대체하는 방식 검토 )
Packer를 사용하여 골드 이미지 생성
Packer 템플릿 작성
{
"variables": {
"aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}",
"region": "us-west-2",
"instance_type": "t2.micro",
"source_ami": "ami-0c55b159cbfafe1f0",
"ssh_username": "ubuntu"
},
"builders": [
{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "{{user `region`}}",
"instance_type": "{{user `instance_type`}}",
"source_ami": "{{user `source_ami`}}",
"ssh_username": "{{user `ssh_username`}}",
"ami_name": "cloudwatch-agent-ami-{{timestamp}}"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo apt-get update",
"sudo apt-get install -y amazon-cloudwatch-agent",
"sudo mkdir -p /opt/aws/amazon-cloudwatch-agent/etc"
]
},
{
"type": "file",
"source": "amazon-cloudwatch-agent.json",
"destination": "/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json"
},
{
"type": "shell",
"inline": [
"sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s"
]
}
]
}
CloudWatch 에이전트 설정 파일 준비
{
"agent": {
"metrics_collection_interval": 60,
"logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
},
"metrics": {
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"InstanceId": "${aws:InstanceId}"
},
"metrics_collected": {
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"disk": {
"measurement": [
"disk_used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"swap": {
"measurement": [
"swap_used_percent"
],
"metrics_collection_interval": 60
},
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"metrics_collection_interval": 60
},
"net": {
"measurement": [
"bytes_sent",
"bytes_recv"
],
"metrics_collection_interval": 60,
"resources": [
"eth0"
]
}
}
}
}
Packer를 사용하여 AMI 빌드
# Packer 템플릿 파일과 설정 파일이 동일 디렉토리에 있는지 확인
packer validate cloudwatch-agent.json
packer build cloudwatch-agent.json
생성된 AMI를 사용하여 EC2 인스턴스 시작
AWS 콘솔을 사용하여 생성된 AMI를 기반으로 인스턴스를 시작합니다.
이 방법을 사용하면 생성된 AMI(골드 이미지)를 기반으로 시작된 모든 EC2 인스턴스는 CloudWatch 에이전트가 미리 설정된 상태로 시작되며, 별도의 추가 설정 없이 자동으로 모니터링을 시작합니다. 이 과정에서 SSH로 직접 접속할 필요가 없습니다.
pip install ansible boto3
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
[defaults]
inventory = ./aws_ec2.yaml
plugin: aws_ec2
regions:
- us-east-1
filters:
instance-state-name: running
hostnames:
- tag:Name
keyed_groups:
- key: tags
prefix: tag
compose:
ansible_host: public_ip_address
private_ip: private_ip_address
---
- name: Install Nginx on EC2 instances
hosts: tag_Name_webserver
become: yes
tasks:
- name: Update and install Nginx
apt:
name: nginx
state: present
update_cache: yes
다음 명령어로 플레이북을 실행합니다.
추가 팁
인스턴스의 IP 주소를 쉽게 얻기 위해 인스턴스를 생성할 때 특정 태그를 추가하는 스크립트를 작성할 수 있습니다.
EC2 인벤토리 플러그인 설정 파일(aws_ec2.yaml)을 필요에 맞게 조정할 수 있습니다.
IAM 역할을 사용하여 더 안전하게 AWS 자격 증명을 관리할 수 있습니다.
이와 같은 설정을 통해 EC2 인스턴스 생성 시 IP가 자동으로 Ansible 인벤토리에 등록되고, 이를 통해 쉽게 배포 작업을 수행할 수 있습니다.
AWS 시스템스 매니저를 통해 Ansible 자동화 가능성 검토
AWS Systems Manager Agent (SSM Agent) 설치 및 설정
SSM Agent는 AWS가 관리하는 모든 AMI에 사전 설치되어 있습니다. 사용자 정의 AMI를 사용하는 경우, SSM Agent를 설치해야 합니다.
예시 (Amazon Linux 2):
sudo yum install -y amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
IAM 역할 설정
EC2 인스턴스가 SSM을 사용할 수 있도록 IAM 역할을 설정합니다.
Ansible 및 관련 패키지 설치
SSM Run Command를 사용하여 인스턴스에 Ansible과 boto3를 설치합니다.
#!/bin/bash
sudo yum install -y python3
pip3 install ansible boto3
Ansible의 dynamic inventory를 설정하는 파일을 준비합니다. 예시로 AWS EC2 인벤토리 플러그인을 설정하는 파일을 작성합니다.
plugin: aws_ec2
regions:
- us-east-1
filters:
instance-state-name: running
hostnames:
- tag:Name
keyed_groups:
- key: tags
prefix: tag
compose:
ansible_host: public_ip_address
private_ip: private_ip_address
nginx_playbook.yaml 파일:
---
- name: Install Nginx on EC2 instances
hosts: tag_Name_webserver
become: yes
tasks:
- name: Update and install Nginx
yum:
name: nginx
state: present
update_cache: yes
SSM Run Command를 사용하여 인스턴스에서 Ansible 플레이북을 실행합니다.
#!/bin/bash
# S3에서 플레이북 및 인벤토리 파일 다운로드
aws s3 cp s3://my-ansible-bucket/nginx_playbook.yaml /tmp/nginx_playbook.yaml
aws s3 cp s3://my-ansible-bucket/aws_ec2.yaml /tmp/aws_ec2.yaml
# Ansible 플레이북 실행
ansible-playbook -i /tmp/aws_ec2.yaml /tmp/nginx_playbook.yaml
SSM Automation을 사용하여 이러한 작업을 자동화할 수 있습니다. SSM Automation 문서를 작성하여 여러 단계를 정의하고 실행할 수 있습니다.
SSM Automation 문서 예제
---
description: "Install Ansible and run playbook using dynamic inventory"
schemaVersion: '0.3'
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
AutomationAssumeRole:
type: String
description: "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf."
default: ""
InstanceId:
type: String
description: "(Required) The instance ID."
default: ""
S3Bucket:
type: String
description: "(Required) The S3 bucket containing the playbook and inventory files."
default: "my-ansible-bucket"
PlaybookFile:
type: String
description: "(Required) The playbook file name."
default: "nginx_playbook.yaml"
InventoryFile:
type: String
description: "(Required) The inventory file name."
default: "aws_ec2.yaml"
mainSteps:
- name: installAnsible
action: aws:runCommand
inputs:
DocumentName: AWS-RunShellScript
InstanceIds: ["{{ InstanceId }}"]
Parameters:
commands:
- sudo yum install -y python3
- pip3 install ansible boto3
- name: runPlaybook
action: aws:runCommand
inputs:
DocumentName: AWS-RunShellScript
InstanceIds: ["{{ InstanceId }}"]
Parameters:
commands:
- aws s3 cp s3://{{ S3Bucket }}/{{ InventoryFile }} /tmp/{{ InventoryFile }}
- aws s3 cp s3://{{ S3Bucket }}/{{ PlaybookFile }} /tmp/{{ PlaybookFile }}
- ansible-playbook -i /tmp/{{ InventoryFile }} /tmp/{{ PlaybookFile }}
실행
SSM 콘솔에서 "Automation"으로 이동합니다.
"Execute automation"을 클릭합니다.
위의 Automation 문서를 선택하고 필요한 매개변수를 입력한 후 "Execute"를 클릭합니다.
이제 AWS Systems Manager를 통해 Ansible의 dynamic inventory를 사용하여 자동으로 플레이북을 실행할 수 있습니다. 이를 통해 인프라를 더 효율적으로 관리하고 자동화할 수 있습니다.
S3 로그를 Athena를 통해 확인
먼저, S3 버킷에 ACL 액세스 로그를 저장하도록 설정해야 합니다. 이 예시에서는 버킷 이름이 my-log-bucket이고 로그가 logs/ 경로에 저장된다고 가정합니다.
ACL 로그 데이터를 쿼리할 수 있도록 Athena에서 데이터베이스와 테이블을 생성합니다.
데이터베이스 생성
CREATE DATABASE s3_access_logs;
CREATE EXTERNAL TABLE s3_access_logs.acl_logs (
bucket_owner STRING,
bucket STRING,
request_datetime STRING,
remote_ip STRING,
requester STRING,
request_id STRING,
operation STRING,
key STRING,
request_uri STRING,
http_status STRING,
error_code STRING,
bytes_sent BIGINT,
object_size BIGINT,
total_time BIGINT,
turn_around_time BIGINT,
referrer STRING,
user_agent STRING,
version_id STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) \\[([^]]*)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*) ([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\" \"([^\"]*)\" ([^ ]*)"
)
LOCATION 's3://my-log-bucket/logs/'
TBLPROPERTIES ('has_encrypted_data'='false');
SELECT remote_ip, COUNT(*) AS request_count
FROM s3_access_logs.acl_logs
GROUP BY remote_ip
ORDER BY request_count DESC
LIMIT 10;
쿼리 결과 확인
쿼리를 실행하면 Athena 콘솔에서 결과를 확인할 수 있습니다. 쿼리 결과는 CSV 형식으로 S3에 저장할 수도 있습니다.
추가 설정 (선택 사항)
파티셔닝
CREATE EXTERNAL TABLE s3_access_logs.acl_logs (
bucket_owner STRING,
bucket STRING,
request_datetime STRING,
remote_ip STRING,
requester STRING,
request_id STRING,
operation STRING,
key STRING,
request_uri STRING,
http_status STRING,
error_code STRING,
bytes_sent BIGINT,
object_size BIGINT,
total_time BIGINT,
turn_around_time BIGINT,
referrer STRING,
user_agent STRING,
version_id STRING
)
PARTITIONED BY (date STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) \\[([^]]*)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*) ([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\" \"([^\"]*)\" ([^ ]*)"
)
LOCATION 's3://my-log-bucket/logs/'
TBLPROPERTIES ('has_encrypted_data'='false');
파티션 추가
ALTER TABLE s3_access_logs.acl_logs
ADD PARTITION (date='2024-06-30') LOCATION 's3://my-log-bucket/logs/2024/06/30/';
요약
S3 버킷에 ACL 로깅 설정: S3 버킷에 ACL 액세스 로그를 저장하도록 설정합니다.
Athena 데이터베이스 및 테이블 생성: Athena에서 데이터베이스와 테이블을 생성합니다.
Athena에서 데이터 쿼리: SQL 쿼리를 사용하여 ACL 로그 데이터를 분석합니다.
쿼리 결과 확인: Athena 콘솔에서 쿼리 결과를 확인합니다.
추가 설정 (선택 사항): 파티셔닝을 사용하여 쿼리 성능을 향상시킬 수 있습니다.
이 과정을 통해 S3에 저장된 ACL 로그를 Athena를 통해 분석할 수 있습니다.