팀 프로젝트- 14회차

박형준·2024년 7월 1일

7월 1일 회의 내용

  • Terraform State 관리
    • tfstate 파일을 위한 back end 설정 필요
  • API Gateway 도메인 및 역할 추가

    • API Gateway에 도메인과 역할을 추가하고, dynamic inventory 설정 자동화 필요
  • WAF (Web Application Firewall)

    • IP set을 이용한 White IP 설정 필요
  • AWS AMI (Amazon Machine Image)

    • 베이스 이미지(골드 이미지)를 사용하여 클라우드 에이전트 자동화

    • Packer를 이용하여 Ansible을 대체하는 방식 검토

  • Amazon Athena

    • S3 로그를 Athena를 통해 확인
  • 시연 시 인스턴스 관리

    • 시연 시 인스턴스 증설 및 감설에 대한 특정 시간 주의

    • CPU 부하를 모니터링하는 알람 설정

  • ECS 또는 EKS

    • EC2를 대체할 수 있는 ECS 또는 EKS 검토
  • CI/CD 자동 배포

    • CI/CD 자동 배포화는 우선순위에서 제외, GitHub Actions와 CodePipeline을 통한 EC2 배포 검토
  • 알람 설정

    • 500 에러에 대한 추가 알람 설정 가능성 검토
  • VPC 구성

    • VPC에 S3(Private Link)나 Lambda 구성 가능성 검토
  • AWS 인스펙터 및 시스템스 매니저

    • AWS 인스펙터를 통한 EC2 취약점 점검

    • AWS 시스템스 매니저를 통해 Ansible 자동화 가능성 검토

  • 시작 템플릿 설정

    • 시작 템플릿에 역할(role) 지정

추가 프로젝트

  • 쿠버네티스 오케스트레이션

    • 현재 구성된 환경을 카펜터 및 쿠버네티스를 통해 오케스트레이션

    • CKA(쿠버네티스 관리자 자격증) 획득을 통한 쿠버네티스 이해 및 진행

  • 서비스 추가 작업 및 이메일 개선

    • 진행 후 서비스 추가 작업 및 이메일 개선
  • 로그 그룹 분석

    • 로그 그룹을 세세하게 분석 (Loki, Grafana, Prometheus 활용)

  • AWS AMI (Amazon Machine Image)

    • 베이스 이미지(골드 이미지)를 사용하여 클라우드 에이전트 자동화

    • Packer를 이용하여 Ansible을 대체하는 방식 검토

  • API Gateway 도메인 및 역할 추가

    • API Gateway에 도메인과 역할을 추가하고, dynamic inventory 설정 자동화 필요( 인스턴스 생성 시 IP를 자동으로 등록 )

    • terraform을 통해 역할 부여

  • AWS 인스펙터 및 시스템스 매니저

    • AWS 인스펙터를 통한 EC2 취약점 점검

    • AWS 시스템스 매니저를 통해 Ansible 자동화 가능성 검토

  • WAF (Web Application Firewall)

    • IP set을 이용한 White IP 설정 필요
  • Amazon Athena

    • S3 로그를 Athena를 통해 확인
  • VPC 구성

    • VPC에 S3(Private Link)나 Lambda 구성 가능성 검토
  • dynamodb 역할을 인스턴스에 부여하면 aws CLI 계정인증 없이 dynamodb 접근 가능

    • 마찬가지로 s3로 가능

    • s3에 저장하는 데이터: 주로 item ( 이미지, 동영상 ... ),

    • dynamodb에 저장하는 데이터: 주로 url


AWS AMI (Amazon Machine Image)

베이스 이미지(골드 이미지)를 사용하여 클라우드 에이전트 자동화
( Packer를 이용하여 Ansible을 대체하는 방식 검토 )

Packer를 사용하여 골드 이미지 생성

  • Packer를 사용하여 CloudWatch 에이전트가 설치되고 설정된 AMI를 생성합니다. 이 AMI를 사용하면 생성된 모든 인스턴스가 CloudWatch 에이전트가 설정된 상태로 시작됩니다.

Packer 템플릿 작성

  • 아래는 Packer 템플릿 예제입니다. 이 템플릿은 CloudWatch 에이전트를 설치하고 설정 파일을 복사하여 에이전트를 시작하는 작업을 수행합니다.
{
  "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 에이전트 설정 파일 준비

  • 업로드된 amazon-cloudwatch-agent.json 파일을 사용합니다. 이 파일은 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 템플릿과 amazon-cloudwatch-agent.json 파일을 사용하여 AMI를 빌드합니다.
# Packer 템플릿 파일과 설정 파일이 동일 디렉토리에 있는지 확인
packer validate cloudwatch-agent.json
packer build cloudwatch-agent.json

생성된 AMI를 사용하여 EC2 인스턴스 시작

  • AWS 콘솔을 사용하여 생성된 AMI를 기반으로 인스턴스를 시작합니다.

    • AWS 콘솔에서 EC2 인스턴스 시작
      AWS Management Console에 로그인합니다.
      EC2 대시보드로 이동합니다.
      "인스턴스 시작"을 클릭합니다.
      "My AMIs" 탭에서 생성한 AMI를 선택합니다.
      인스턴스 유형을 선택합니다.
      네트워크 설정 및 키 페어를 선택합니다.
      필요한 다른 설정을 완료하고 인스턴스를 시작합니다.

이 방법을 사용하면 생성된 AMI(골드 이미지)를 기반으로 시작된 모든 EC2 인스턴스는 CloudWatch 에이전트가 미리 설정된 상태로 시작되며, 별도의 추가 설정 없이 자동으로 모니터링을 시작합니다. 이 과정에서 SSH로 직접 접속할 필요가 없습니다.


dynamic inventory 설정 자동화

  1. Ansible 및 관련 패키지 설치
  • 예시
pip install ansible boto3
  1. AWS 자격 증명 설정
  • ~/.aws/credentials 파일에 AWS 자격 증명을 설정합니다.
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
  1. Dynamic Inventory 스크립트 설정
  • Ansible은 이미 AWS EC2 인벤토리 플러그인을 제공합니다. ansible.cfg 파일에서 해당 플러그인을 사용하도록 설정합니다.
[defaults]
inventory = ./aws_ec2.yaml
  1. AWS EC2 인벤토리 플러그인 설정 파일 생성
  • 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
  1. EC2 인스턴스 태깅
  • EC2 인스턴스를 생성할 때 적절한 태그를 추가합니다. 예를 들어, 태그 Name을 사용하여 인스턴스 이름을 설정합니다.
    1. Ansible 플레이북 작성
      EC2 인스턴스에 배포할 플레이북을 작성합니다. 예시로 간단한 Nginx 설치 플레이북을 작성해보겠습니다.
---
- 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
  1. Ansible 플레이북 실행
  • 다음 명령어로 플레이북을 실행합니다.

    • ansible-playbook -i aws_ec2.yaml your_playbook.yaml

추가 팁

  • 인스턴스의 IP 주소를 쉽게 얻기 위해 인스턴스를 생성할 때 특정 태그를 추가하는 스크립트를 작성할 수 있습니다.

  • EC2 인벤토리 플러그인 설정 파일(aws_ec2.yaml)을 필요에 맞게 조정할 수 있습니다.

  • IAM 역할을 사용하여 더 안전하게 AWS 자격 증명을 관리할 수 있습니다.

이와 같은 설정을 통해 EC2 인스턴스 생성 시 IP가 자동으로 Ansible 인벤토리에 등록되고, 이를 통해 쉽게 배포 작업을 수행할 수 있습니다.


AWS 인스펙터 및 시스템스 매니저 ( dynamic inventory )

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 역할을 설정합니다.

    • AWS Management Console에서 IAM 역할을 생성합니다.
      AmazonSSMManagedInstanceCore 정책을 역할에 연결합니다.
      이 역할을 EC2 인스턴스에 연결합니다.

Ansible 및 관련 패키지 설치

  • SSM Run Command를 사용하여 인스턴스에 Ansible과 boto3를 설치합니다.

    • SSM 콘솔에서 "Run Command"로 이동합니다.
      "Run a command"를 클릭합니다.
      AWS-RunShellScript 문서를 선택합니다.
      다음 스크립트를 사용하여 Ansible 및 boto3를 설치합니다.
#!/bin/bash
sudo yum install -y python3
pip3 install ansible boto3
  • 적절한 인스턴스 대상과 IAM 역할을 선택한 후 "Run"을 클릭합니다
  1. Dynamic Inventory 설정
  • Ansible의 dynamic inventory를 설정하는 파일을 준비합니다. 예시로 AWS EC2 인벤토리 플러그인을 설정하는 파일을 작성합니다.

    • 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
  1. Ansible 플레이북 작성
    배포하고자 하는 Ansible 플레이북을 작성합니다. 예를 들어, 간단한 Nginx 설치 플레이북을 작성합니다.

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
  1. 플레이북과 인벤토리 파일을 S3에 업로드
  • 플레이북 파일과 인벤토리 파일을 S3 버킷에 업로드합니다. 예를 들어, my-ansible-bucket 버킷에 nginx_playbook.yaml과 aws_ec2.yaml 파일을 업로드합니다.
  1. SSM Run Command를 사용하여 Ansible 플레이북 실행
  • SSM Run Command를 사용하여 인스턴스에서 Ansible 플레이북을 실행합니다.

    • SSM 콘솔에서 "Run Command"로 이동합니다.
      "Run a command"를 클릭합니다.
      AWS-RunShellScript 문서를 선택합니다.
      다음 스크립트를 사용하여 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
  • 적절한 인스턴스 대상과 IAM 역할을 선택한 후 "Run"을 클릭합니다.
  1. 자동화 구성
  • SSM Automation을 사용하여 이러한 작업을 자동화할 수 있습니다. SSM Automation 문서를 작성하여 여러 단계를 정의하고 실행할 수 있습니다.

  • SSM Automation 문서 예제

    • 다음은 SSM Automation 문서의 YAML 예제입니다.
---
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를 사용하여 자동으로 플레이북을 실행할 수 있습니다. 이를 통해 인프라를 더 효율적으로 관리하고 자동화할 수 있습니다.


Amazon Athena

S3 로그를 Athena를 통해 확인

  1. S3 버킷에 ACL 로깅 설정
  • 먼저, S3 버킷에 ACL 액세스 로그를 저장하도록 설정해야 합니다. 이 예시에서는 버킷 이름이 my-log-bucket이고 로그가 logs/ 경로에 저장된다고 가정합니다.

    • AWS Management Console에서 S3 서비스로 이동합니다.
      ACL 로깅을 설정하려는 버킷을 선택합니다.
      "Properties" 탭에서 "Server access logging"을 선택합니다.
      "Enable logging"을 클릭하고, 로그를 저장할 대상 버킷과 로그 파일 경로를 설정합니다. 예를 들어, my-log-bucket의 logs/ 경로를 지정합니다.
  1. Athena 데이터베이스 및 테이블 생성
  • ACL 로그 데이터를 쿼리할 수 있도록 Athena에서 데이터베이스와 테이블을 생성합니다.

  • 데이터베이스 생성

    • Athena 콘솔에서 "Query Editor"로 이동합니다.
      다음 SQL 쿼리를 실행하여 데이터베이스를 생성합니다.
CREATE DATABASE s3_access_logs;
  • 테이블 생성
    • ACL 로그 형식에 따라 테이블을 생성합니다. 예를 들어, 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
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([^ ]*) ([^ ]*) \\[([^]]*)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*) ([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\" \"([^\"]*)\" ([^ ]*)"
)
LOCATION 's3://my-log-bucket/logs/'
TBLPROPERTIES ('has_encrypted_data'='false');
  1. Athena에서 데이터 쿼리
  • 테이블이 생성되면 Athena를 사용하여 SQL 쿼리를 실행할 수 있습니다. 예를 들어, 특정 IP에서 발생한 요청 수를 확인하는 쿼리는 다음과 같습니다.
SELECT remote_ip, COUNT(*) AS request_count
FROM s3_access_logs.acl_logs
GROUP BY remote_ip
ORDER BY request_count DESC
LIMIT 10;
  1. 쿼리 결과 확인
    쿼리를 실행하면 Athena 콘솔에서 결과를 확인할 수 있습니다. 쿼리 결과는 CSV 형식으로 S3에 저장할 수도 있습니다.

  2. 추가 설정 (선택 사항)

  • 파티셔닝

    • 로그 데이터가 매우 큰 경우, Athena에서 쿼리 성능을 향상시키기 위해 파티셔닝을 사용할 수 있습니다. 예를 들어, 날짜별로 파티셔닝할 수 있습니다.
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를 통해 분석할 수 있습니다.

0개의 댓글