EC2 인스턴스 1대 이상 준비

https://yes5.tistory.com/29

 

AWS EC2 생성 (ubuntu 프리티어)

EC2 검색 > 인스턴스 인스턴스 시작 클릭 이름 지정 OS 선택 (여기선 ubuntu Server 22.04 LTS ) 인스턴스 유형 t2.micro 키 페어 선택 없다면 새 키 페어 생성 .pem으로 생성 putty 사용자라면 .ppk 네트워크 설

yes5.tistory.com

인스턴스 ID 클릭 > 태그 > 태그 관리

DAY : 정지, 가동 기능을 사용 할 요일 선택

TIME : 가동 할 시간 선택 (범위 밖의 시간은 정지 상태)

AUTOSTOP_ENABLE : true 사용, false 미사용

저장

 

IAM 검색 > 액세스 관리 > 정책

 

정책 생성

 

정책 편집기 > JSON

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}

위 코드 내용 복붙

 

다음

 

정책 이름 : EC2_Auto_Start_Stop

설명 : EC2_Auto_Start_Stop

> 정책 생성

 

IAM > 엑세스 관리 > 역할 > 역할 만들기

 

AWS 서비스

 

사용 사례 > Lambda

 

다음

 

권한정책 > 검색창 EC2_Auto_Start_Stop 입력 > 선택 > 다음

 

역할 이름 : EC2_Auto_Start_Stop_Role > 역할 생성

 

Lambda 검색 >  함수 > 함수 생성

 

함수 이름 : EC2_Auto_Start_Stop_Lambda

런타임 : Python 3.8

 

기본 실행 역할 변경 > 기존 역할 사용 

 

EC2_Auto_Start_Stop_Role 선택 > 함수 생성

 

# -*- coding: utf-8 -*-
import boto3
from datetime import datetime

# 서울 리전
region = 'ap-northeast-2'
# 월 ~ 일요일 
t = ["월", "화", "수", "목", "금", "토", "일"]

def lambda_handler(event, context):
    # 람다 호출된 시점의 시간을 구합니다.
    print("start")
    now_date = t[datetime.today().weekday()]
    now_hour = int(datetime.now().strftime('%H')) + 9
    print(f"now >> date: {now_date}, hour: {now_hour}")

    # ec2 인스턴스의 모든 태그를 조회합니다.
    ec2 = boto3.client('ec2', region_name=region)
    response = ec2.describe_tags(
        Filters=[
            {
                'Name': 'resource-type',
                'Values': ['instance']
            }
        ]
    )
    
    # 값 임시 저장
    enable_instances = []
    day_instances = {}
    time_instances = {}
    
    # AUTO_STOP_ENABLE 태그가 true인 값만 추출합니다
    for tag in response['Tags']:
        if tag['Key'] == "AUTOSTOP_ENABLE" and tag['Value'].lower() == "true":
            enable_instances.append(tag['ResourceId'])
        if tag['Key'] == "DAY":
            day_instances[tag['ResourceId']] = tag['Value']
        if tag['Key'] == "TIME":
            time_instances[tag['ResourceId']] = tag['Value']

    for instance in enable_instances:
        try:
            # 요일이 일치하는지 확인합니다.
            days = day_instances[instance].split(",")            
            is_day = False
            for d in days:
                if now_date == d:
                    is_day = True
            
            # 시간이 일치하는지 확인합니다.
            times = time_instances[instance].split("~")
            is_start_time = False
            is_end_time = False
            if int(times[1].strip()) == now_hour:
                is_end_time = True
            elif int(times[0].strip()) == now_hour:
                is_start_time = True

            if is_day == True and is_end_time == True:
                # 중지 인스턴스 호출
                ec2.stop_instances(InstanceIds=[instance])
            elif is_day == True and is_start_time == True:
                # 시작 인스턴스 호출
                ec2.start_instances(InstanceIds=[instance])
        except Exception as ex:
            print(ex)
    
    print("end")

코드 소스 > 코드 복붙 > Deploy

 

트리거 추가 

 

EventBridge 선택

 

룰 이름 : EC2_Auto_Start_Stop

cron(0 */1 * * ? *) 매시 정각에 람다 호출 

추가

 


설정 끝 테스트 시작

 

먼저 test, auto-start-stop 인스턴스 모두 종료

test 인스턴스의 태그
auto-start-stop 인스턴스의 태그

람다 함수가 실행 되면 test 인스턴스만 실행되어야 한다. ( 현재 시간 14시 )

 

Test 클릭

 

now >> date : 현재요일, hour: 현재시간 표시

 

스크립트 실행 결과 test 인스턴스만 실행된 것 확인

서버에 침해사고가 발생했을 때 last 명령어로 최근 접속에 대한 정보를 알아야 한다.

개발자나 서버 운영자 개인 계정에 전체 권한을 주지 않고 필요한 계정의 권한과 명령어를 alias에 등록해서 사용하게 하면

계정별 접속 정보를 last명령어로 확인 할 수 있다.

 

예시에선 tomcat 계정이 tomcat 디렉터리와 데몬에 대한 권한을 가졌고, testuser는 개발자의 개인 계정이라고 설정한다.

 

testuser 계정에서 명령어를 실행

vi /home/testuser/.bashrc
# .bashrc
alias logview='su - tomcat -c "tail -f /home/tomcat/logs/catalina.out"'

tomcat 계정의 패스워드를 입력하면 tomcat 로그를 확인 할 수 있다.

로그뷰 외에 톰캣 실행, 정지 등 필요한 명령어를 alias에 등록하여 tomcat 계정 사용을 방지하고 개인 계정 사용을 장려한다.

alias

명령어 사용 시 현재 계정에 등록 된 alias 확인 가능

https://yes5.tistory.com/28

 

EC2 - S3 파일 복사

EC2 서버와 S3 버켓은 구축 되어 있다고 가정하고 시작한다. 안 되어 있다면 https://yes5.tistory.com/29 AWS EC2 생성 (ubuntu 프리티어) EC2 검색 > 인스턴스 인스턴스 시작 클릭 이름 지정 OS 선택 (여기선 ubun

yes5.tistory.com

위 게시물에서 EC2 - S3 간 통신을 다뤘습니다.

이제 로그 백업 시스템을 만들어 보겠습니다.

 

 

vi /home/script/wasbck.sh

#!/bin/bash

# Hostname
HOSTNAME='TWAS01'
#HOSTNAME=`hostname -f`

# Date
# Date 함수 기반 포멧 지정
DATEYMDM=$(date +"%Y-%m-%d" -d '1 days ago')
DATEYMD=$(date +"%Y%m%d" -d '1 days ago')
DATEYM=$(date +"%Y%m" -d '1 days ago')
DATED=$(date +"%d" -d '1 days ago')

# Dir
# tomcat, S3 경로
TOMDIR='/etc/tomcat/logs'
WLOGDIR='/etc/tomcat/was_logs'
S3DIR='s3://kimohseong-test/was'

# 1.copy catalina.out log
aws s3 cp ${TOMDIR}/catalina.out-${DATEYMD}.gz ${S3DIR}/${DATEYM}/${DATED}/${HOSTNAME}/catalina.out.${DATEYMDM}.gz

# 2.copy tomcat log
# 2-1.log 압축
tar zcvfP ${WLOGDIR}/catalina.${DATEYMDM}.log.gz ${TOMDIR}/catalina.${DATEYMDM}.log
tar zcvfP ${WLOGDIR}/localhost.${DATEYMDM}.log.gz ${TOMDIR}/localhost.${DATEYMDM}.log
tar zcvfP ${WLOGDIR}/localhost_access_log.${DATEYMDM}.txt.gz ${TOMDIR}/localhost_access_log.${DATEYMDM}.txt

# 2-2 copy to s3
aws s3 cp ${WLOGDIR}/catalina.${DATEYMDM}.log.gz ${S3DIR}/${DATEYM}/${DATED}/${HOSTNAME}/catalina.${DATEYMDM}.log.gz
aws s3 cp ${WLOGDIR}/localhost.${DATEYMDM}.log.gz ${S3DIR}/${DATEYM}/${DATED}/${HOSTNAME}/localhost.${DATEYMDM}.log.gz
aws s3 cp ${WLOGDIR}/localhost_access_log.${DATEYMDM}.txt.gz ${S3DIR}/${DATEYM}/${DATED}/${HOSTNAME}/localhost_access_log.${DATEYMDM}.txt.gz

#Hostname

서버에서 Hostname을 지정했다면 #HOSTNAME=`hostname -f` 부분의 주석을 풀고 사용

 

#Date

위 스크립트에선 파일 전송을 새벽에 할 계획이기 때문에 로그 저장 날짜를 전송 날짜 전일로 지정

전송 날짜로 지정 하신다면 #Date 부분에 -d '1 days ago' 를 제외하시면 됩니다.

 

#Dir

예시는 tomcat 기준의 경로이며 기본 디폴트 경로가 아님. 필요한 로그의 데몬 경로에 맞게 지정 후 사용

S3DIR 경로도 자신의 버켓 주소로 변경

 

#copy

EC2 서버에 7일, bucket에 90일 저장 후 글래시어에 보낼 계획이기 때문에 mv 명령어 대신 cp 사용

이후 crontab에 삭제 명령어 추가

 

 

crontab -e

0 4 * * * /home/script/wasbck.sh
0 5 * * * find /etc/tomcat/logs/ -type f -mtime +7 -delete
0 6 * * * find /etc/tomcat/was_logs/ -type f -mtime +7 -delete

service crond restart

 

 

 

 

 

프론트엔드 배포, 데이터 아카이브 용도의 S3 버킷 생성입니다.

실무에서 사용이 목적이라면 맞지 않습니다.

 

S3검색 > 버킷

 

버킷 만들기

 

버킷 이름과 리전을 알맞게 선택

도메인을 사용할 것이라면, naver.com 이런식으로 www를 제외한 .com or .net 까지 도메인명으로 버킷이름을 만들어야 한다.

데이터 아카이브 용도라면 알아보기 쉽게 버킷 이름을 설정.

모두 해제 ( 실무 사용 시 ACL 및 암호 지정 필요 )

나머지는 디폴트로 버킷 생성

 

데이터 아카이브 용도라면 여기까지 설정 하면 됩니다.

 

 

프론트 배포 용도라면 추가로 몇가지 설정이 필요합니다.

속성 항목 최하단

정적 웹 사이트 호스팅 편집

 

정적 웹 사이트 호스팅 활성화

인덱스 문서, 오류 문서 index.html 입력

 

권한 > 버킷 정책 편집

 

정책 생성기

 

Select Type of Policy : S3 Bucket Policy

 

Principal : *

 

Actions : GetObject

 

ARN 복사

 

ARN 입력 후 /* 추가

 

Add Statement 클릭 > Generate Policy 클릭

 

복사

 

버킷 정책 편집으로 돌아와 붙여넣기 > 변경사항 저장

 

 

 

EC2 검색 > 인스턴스

 

인스턴스 시작 클릭

 

이름 지정

 

OS 선택 (여기선 ubuntu Server 22.04 LTS )

 

 

인스턴스 유형 t2.micro 

 

 

키 페어 선택 

없다면 새 키 페어 생성

 

.pem으로 생성

putty 사용자라면 .ppk

 

네트워크 설정 > 네트워크 편집

VPC 선택 > 서브넷 선택 여기선 ap-northeast-2a

 

퍼블릭 IP 자동 할당 ( 탄력적 IP 사용 예정이라면 비활성화)

https://yes5.tistory.com/25

 

AWS 탄력적 IP 할당 ( 퍼블릭 IP 고정 )

AWS에서 EC2 검색 네트워크 및 보안 > 탄력적 IP 탄력적 IP 주소 할당 네트워크 경계 그룹 ap-northeast-2(서울) 탄력적 IP주소 할당 성공 화면 이전 게시물에서 복사한 test2 인스턴스에 할당 https://yes5.tist

yes5.tistory.com

 

보안 그룹이 이미 있다면 기존 보안 그룹에서 선택

없다면 위와 같이 ssh (22번 port) 0.0.0.0/0으로 열어준다.

자신의 PC 아이피를 안다면 0.0.0.0/0 모든 허용 대신

자신의 아이피/32 허용으로 하는게 더 바람직하다.

 

EBS 볼륨크기는 30GB 이하로 알맞게 설정한다.

인스턴스 시작

 

인스턴스 목록에서 first ec2 인스턴스가 생성된 것을 확인.

 

1~2분 후 대기중 > 실행중으로 변경된 것을 확인.

 

ssh 클라이언트를 이용해 접속 확인을 해보고 싶다면

https://yes5.tistory.com/26

 

AWS EC2 ssh 비밀번호로 접속

보통 EC2 인스턴스를 생성하거나, 복제할 때 키 페어를 생성 및 선택한다. 혹은 EC2 검색 > 네트워크 및 보안 > 키 페어에서 키 페어 생성 및 수정이 가능하다. ssh client로 xshell 사용자는 .pem putty 사

yes5.tistory.com

 

 

EC2 서버와 S3 버켓은 구축 되어 있다고 가정하고 시작한다.

안 되어 있다면

https://yes5.tistory.com/29

 

AWS EC2 생성 (ubuntu 프리티어)

EC2 검색 > 인스턴스 인스턴스 시작 클릭 이름 지정 OS 선택 (여기선 ubuntu Server 22.04 LTS ) 인스턴스 유형 t2.micro 키 페어 선택 없다면 새 키 페어 생성 .pem으로 생성 putty 사용자라면 .ppk 네트워크 설

yes5.tistory.com

https://yes5.tistory.com/30

 

AWS S3 버킷 생성 JS, React 배포, 데이터 백업

프론트엔드 배포, 데이터 아카이브 용도의 S3 버킷 생성입니다. 실무에서 사용이 목적이라면 맞지 않습니다. S3검색 > 버킷 버킷 만들기 버킷 이름과 리전을 알맞게 선택 도메인을 사용할 것이라

yes5.tistory.com

 

먼저 s3와 통신이 되는지 확인해 본다.

aws s3 ls

aws configure를 지정하지 않아

Unable to locate credentials. You can configure credentials by running "aws configure".

에러가 발생한다.

 

IAM 검색 > 엑세스 관리 > 사용자

 

사용자 생성 클릭

 

IAM 권한에 관한 게시물이 아니기 때문에 test용 계정을 생성한다.

사용자 이름 : test등 임의로 설정

AWS Management Console에 대한 사용자 엑세스 권한 제공 > IAM 사용자를 생성하고 싶음

콘솔 암호 > 사용자 지정 암호

 

다음

사용자 생성

 

사용자 목록으로 돌아가기

 

계속

 

사용자 이름 클릭

 

보안 자격 증명 > 엑세스 키 > 엑세스 키 만들기

 

CLI 체크 다음

 

엑세스 키 만들기

 

엑세스 키 및 비밀 엑세스 키 확인

비밀 엑세스 키는 이 화면에서 한번 확인 후 확인이 불가능 하니 따로 저장해 놓는다.

 

엑세스 관리 > 사용자 그룹 > 그룹생성

 

그룹 이름을 설정하고, 방금 만든 계정을 추가, AdministratorAccess 정책 선택 후 그룹 생성

 

이제 다시 xshell로 돌아가

aws configure

1. 엑세스 키 복붙

2. 비밀 엑세스 키 복붙

3. ap-northeast-2 ( 해외 리전의 경우 알맞게 입력 )

4. 엔터

 

aws s3 ls

 

 

s3와 통신이 되는 것을 확인

 

touch test.txt
echo "test" > test.txt

 

# aws s3 cp test.txt ( S3 버켓 명과 도착지 경로 및 파일명 입력 예시 : s3://kimohseong-test/test.txt )
aws s3 cp test.txt s3://kimohseong-test/test.txt

 

AWS 콘솔 화면에서 S3 버켓 접속 후 파일 복사 확인

 

EC2 - S3 간 파일 복사는 위 설명대로 하면 될것이다.

이제 crontab과 bash 스크립트를 이용해 로그 백업 시스템을 만들어보자.

 

EC2 검색 > 인스턴스

 

용량 증설 할 인스턴스 ID 클릭 (test2)

 

스토리지 탭 > 볼륨 ID 클릭

 

볼륨 선택 > 작업 > 볼륨 수정

 

크기 지정 10 > 20

 

 

 

옵티마이징하는 동안 시간이 소요된다.

 

일정 시간 기다리면 크기가 10 > 20 GB로 변경 됐고, 사용 중으로 표시된다.

 

 

df -Th

ec2 서버에 접속해서 확인 해보면 여전히 10G.

 

lsblk

lsblk 명령어로 20G 확인 및 디스크 유형 확인 (xvda or nvme)

# xvda의 경우
sudo growpart /dev/xvda 1

# nvme의 경우
sudo growpart /dev/nvme0n1 1

# xvda, nvme 동일
sudo xfs_growfs -d /

 

20G 증설 확인

보통 EC2 인스턴스를 생성하거나, 복제할 때 키 페어를 생성 및 선택한다.

혹은 EC2 검색 > 네트워크 및 보안 > 키 페어에서 키 페어 생성 및 수정이 가능하다.

 

ssh client로 xshell 사용자는 .pem

putty 사용자는 AWS 인스턴스 키페어 생성 시 .ppk로 생성

xshell로 진행

 

연결 탭에서 호스트를 접속 할 퍼블릭 IP로 입력하고,

 

사용자 인증 탭에서 사용자 이름 (최초 접속 시 ec2-user) 입력 방법을 Password 클릭

 

분명 인증 방법으로 Password 방식을 선택했지만 key로만 접근이 가능한 상황.

우선 생성한 키 페어로 접속.

찾아보기 > 키 페어 선택 

암호는 입력하지 않아도 된다. ( ec2-user 접속 시 )

이제 password를 이용한 인증을 적용해 보자.

 

 

sudo vi /etc/ssh/sshd_config

PasswordAuthentication

no > yes 변경

sudo service sshd restart

sshd 재실행

 

sudo passwd ec2-user

 

ec2-user 패스워드 설정

설정한 패스워드 입력

 

 

+ Recent posts