이전 포스팅: https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-1

 

[CI/CD] EC2 CodePipeline Test -1

Spring project 생성 * 환경: jdk-21, Gradle, vscode 활용 vscode에서 ctrl + shift + p (Show all commands) 단축키를 누르고 spring Initializr 를 검색합니다. 원하는 대로 선택 후 프로젝트 생성하면 됩니다. 테스트 용도

realyun99.tistory.com

 

이전 포스팅에서 수동으로 배포하는 방법에 대해 알아보았다면, 이번 포스팅에선 해당 수동 배포를 자동화하는 방법에 대해 알아보겠습니다.

* github, github action, codedeploy 활용


Github Action 설정 (CI)

yaml 파일로 설정하기 위해 해당 네모 부분 클릭해 들어갑니다.

 

# workflow의 이름
name: CI

# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
  push:
    branches: [ master ] # main branch로 push 될 때 실행됩니다.
  pull_request:
    branches: [ master ]  # main branch로 pull request될 때 실행됩니다.

# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
  build:
    name: CI
    # 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
    runs-on: ubuntu-latest

    steps:
     # 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
      - uses: actions/checkout@v2
      - name: Set up JDK 21
        uses: actions/setup-java@v2
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: sudo chmod +x ./gradlew
        shell: bash
      
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

위 코드를 넣어 줍니다.

 

이후 로컬 프로젝트에서 git pull 로 가져와야합니다!!

 

 

AWS IAM User 생성(액세스 키 발급)

S3FullAccess, CodeDeployFullAccess 관련 정책을 넣은 사용자를 생성합니다.

생성된 사용자에서 액세스 키를 생성해 다운로드합니다.

 

 

S3 버킷 생성

zip 파일을 담을 프라이빗 버킷을 생성해줍니다.

 

 

Github Action secrets 추가

위에서 생성했던 액세스키와 리전을 넣어줍니다.

 

 

deploy.sh 파일 생성

#!/bin/bash
BUILD_JAR=$(ls /home/ec2-user/action/build/libs/*-SNAPSHOT.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> build cicd-test: $JAR_NAME" >> /home/ec2-user/action/deploy.log

echo "> build 파일 복사" >> /home/ec2-user/action/deploy.log
DEPLOY_PATH=/home/ec2-user/action/
cp $BUILD_JAR $DEPLOY_PATH

echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ec2-user/action/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ec2-user/action/deploy.log
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포"    >> /home/ec2-user/action/deploy.log
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/action/deploy_err.log &

위 스크립트를 프로젝트 폴더에 scripts 폴더 생성 후 그 안에 넣습니다.

 

그 후 github에 push 합니다.

 

 

Github Action 설정 (CD)

.github/workflows 폴더 안에 cd.yaml 파일을 생성하고 아래 코드를 넣어주세요.

# workflow의 이름
name: CD

# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
  push:
    branches: [ master ] # master branch로 push 될 때 실행됩니다.

# 해당 yml 내에서 사용할 key - value
env:
  S3_BUCKET_NAME: realyun-cicd-test
  PROJECT_NAME: cicd-test
  
# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
  build:
    name: CD
    # 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
    runs-on: ubuntu-latest

    steps:
     # 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
      - uses: actions/checkout@v2
      - name: Set up JDK 21
        uses: actions/setup-java@v2
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: sudo chmod +x ./gradlew
        shell: bash
      
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
        
      - name: Make zip file
        run: zip -r ./$GITHUB_SHA.zip .
        shell: bash

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
          
      # script files 복사
      - name: Copy script
        run: cp ./scripts/*.sh ./deploy
      
      # S3에 업로드
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip

 

성공하면 버킷에 zip 파일이 담긴 것을 확인할 수 있습니다.

 

 

EC2 역할 추가

EC2에 적용할 CodeDeploy role을 만들어 줍니다.

 

IAM 역할 수정을 클릭해 위에서 생성했던 role을 적용합니다. (인스턴스 재부팅 해야 적용됨!)

 

 

EC2에 CodeDeploy agent 설치

aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
chmod +x ./install 
sudo ./install auto
sudo service codedeploy-agent status

# ruby 에러 시
sudo yum install ruby

위 이미지처럼 running 메시지를 확인하면 잘 돌아가고 있음을 알 수 있습니다.

 

 

CodeDeploy 권한 추가 및 애플리케이션 생성

EC2에 권한을 추가한 것 처럼 CodeDeploy에도 EC2에 접근할 수 있는 권한을 생성합니다.

 

애플리케이션 생성
배포그룹 생성

위에서 CodeDeploy를 위해 생성했던 역할을 선택한 뒤 EC2 인스턴스로 구성해주면 됩니다.

(로드밸런싱은 비활성화로 진행)

 

version: 0.0
os: linux
# S3에 있는 zip 파일이 EC2에 배포될 위치를 지정
files:
  - source: / # CodeDeploy에서 전달해 준 파일 중 destination으로 이동시킬 대상을 루트로 지정(전체파일)
    destination: /home/ec2-user/action/ # source에서 지정된 파일을 받을 위치, 이후 jar를 실행하는 등은 destination에서 옮긴 파일들로 진행
    overwrite: yes

permissions: # CodeDeploy에서 EC2서버로 넘겨준 파일들을 모두 ec2-user권한을 갖도록 합니다.
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

# ApplicationStart 단계에서 deploy.sh를 실행시키도록 합
hooks: # CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
  ApplicationStart: # deploy.sh를 ec2-user권한으로 실행합니다.
    - location: scripts/deploy.sh
      timeout: 60 # 스크립트 실행 60초 이상 수행되면 실패가 됩니다.
      runas: ec2-user

codedeploy를 위한 appspec.yml 파일을 프로젝트의 최상단에 넣어줍니다.

 

 

Github Action(CD) deploy 추가

      # Deploy
      - name: Deploy
        run: |
          aws deploy create-deployment \
          --application-name realyun-ec2-cicd-test \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ec2-cicd-test \
          --file-exists-behavior OVERWRITE \
          --s3-location bucket=realyun-cicd-test,bundleType=zip,key=cicd-test/$GITHUB_SHA.zip \
          --region ap-northeast-2 \

위 코드들을 cd.yaml에 추가하면 끝이 납니다!!

 

 

 

위에서 사용했던 파일들은 위와 같이 저장되어 있어야 합니다.

(* github과 동기화 확인하기!!)

'Toy Project' 카테고리의 다른 글

[CI/CD] EC2 CodePipeline Test -3  (0) 2024.03.25
[CI/CD] EC2 CodePipeline Test -1  (0) 2024.03.18

Spring project 생성

* 환경: jdk-21, Gradle, vscode 활용

 

vscode에서 ctrl + shift + p (Show all commands) 단축키를 누르고 spring Initializr 를 검색합니다.

원하는 대로 선택 후 프로젝트 생성하면 됩니다.

 

CICD-Test/src/main/java/com/example/cicdtest/resoures 아래 static 폴더 생성 후 index.html 추가

테스트 용도의 간단한 페이지를 하나 생성합니다. (! + enter 치면 기본 html 틀 코드 생성됨)

cd <project-folder>

./gradlew
./gradlew build
./gradlew bootRun

vscode의 bash terminal 위에서 해당 명령어들을 입력해 확인합니다. (http://localhost:8080)

 

해당 프로젝트를 github에 올립니다.

cd <project-folder>

git config --global user.email "~~~"
git init

git add .
git status
git commit -m "~~~"

git remote add origin <github-주소>
git push origin master

 

배포할 EC2 인스턴스 생성

원하는 인스턴스 유형과 키페어, 네트워크 설정(퍼블릭) 후 인스턴스를 생성합니다.

(보안그룹의 경우 ssh(내 IP), 8080(0.0.0.0/0) ,http(0.0.0.0/0) 열어주기)

 

 

수동 배포

아래 명령어들을 EC2 인스턴스 ssh 접속 후 차례로 입력합니다.

sudo yum install git

sudo yum install java-21-amazon-corretto
java -version

sudo timedatectl set-timezone Asia/Seoul

mkdir app
cd ~/app
git clone https://github.com/realyun99/cicd-test.git
cd cicd-test

# gradle clean build
sudo chmod +x gradlew
sudo ./gradlew build

cd build/libs/
java -jar cicd-test-0.0.1-SNAPSHOT.jar

nohup java -jar cicd-test-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &
tail -f log.out
tail -f err.out

 

잘 설정되었는지 http://<ec2-public-ip>:8080 으로 확인합니다.

 

현재 수동 배포의 명령어들을 스크립트로 짜보려고 합니다.

 

배포 스크립트 생성

위에서 git clone을 받았던 /app/git 폴더로 들어가 deploy.sh 파일을 생성한 후 아래의 스크립트를 넣어줍니다.

#!/bin/bash

REPOSITORY=/home/ec2-user/app
cd $REPOSITORY/cicd-test/

echo "> Git Pull"
git pull

echo "> 프로젝트 Build 시작"
./gradlew build

echo "> Build 파일 복사"
cp ./build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f cicd-test)

echo "$CURRENT_PID"

if [ -z $CURRENT_PID ]; then
    echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -2 $CURRENT_PID"
    kill -9 $CURRENT_PID
    sleep 5
fi

echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep 'cicd-test' | tail -n 1)

echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &

 

아래의 명령어를 통해 스크립트를 실행합니다.

cd /app/git/cicd-test
sudo chmod +x gradlew

cd /app/git
sudo chmod 755 ./deploy.sh
./deploy.sh

여기까지 다 적용했다면 현재까지 구현된 기능은 아래와 같습니다.

1) 코드 수정 후 git push

2) ec2 접속 후 deploy.sh 실행 → 코드 배포

'Toy Project' 카테고리의 다른 글

[CI/CD] EC2 CodePipeline Test -3  (0) 2024.03.25
[CI/CD] EC2 CodePipeline Test -2  (1) 2024.03.19

* 기본적인 세팅은 되어 있는 상태 입니다. (VPC, Nat GW, ALB, EC2(private subnet) 구성)

* private ec2: etech-private-ec2(10.0.11.130)


3. OpenVPN을 통한 접속

OpenVPN은 가상 사설 네트워크(VPN)를 구축하여 외부에서 안전하게 인프라에 접속할 수 있도록 합니다.

사용자는 OpenVPN 클라이언트를 사용하여 VPN에 연결한 후 private 리소스에 접속할 수 있습니다.

 

1) OpenVPN 서버를 생성합니다.

 

원하는 이름 설정

더 많은 AMI 찾아보기를 클릭합니다.

 

openvpn을 검색하고 Marketplace AMI 중 제일 위에 있는 이미지를 선택합니다.

 

인스턴스 유형은 small 이상으로 잡아주시면 됩니다.

 

vpc는 private-ec2가 올라가있는 public subnet을 선택하고 인바운드 보안 그룹 규칙은 디폴트로 설정 합니다.

(TCP/22 (SSH), TCP/943, TCP/443(웹 인터페이스에 대한 HTTPS 액세스) 및 UDP/1194)

 

나머지 설정은 디폴트로 두고 인스턴스 시작을 클릭합니다.

 

* EIP를 할당해 openvpn server의 ip가 고정이 될 수 있게 설정을 하는 것을 추천드립니다.

 

 

2) OpenVPN 서버에 접속해 설정 및 사용자를 생성 합니다.

ssh 접속

host에 OpenVPN 서버의 public ip를, username에 openvpnas, 서버의 key pair까지 넣고 ssh 접속을 합니다.

 

yes 입력 후 enter

쭉 디폴트로 enter를 치면 끝에 이미지와 같이 접속 정보를 얻을 수 있습니다.

 

Admin UI 주소로 접속

해당 서버에서 자체 발행 한 인증서를 통해 SSL 접속을 제공하기 때문에 브라우저에서 접속이 안전하지 않을 수도 있음을 경고하는 것으로 고급을 클릭한 뒤 안전하지 않음으로 이동해주세요.

 

해당 Admin UI 주소로 접속한 뒤 user / password를 입력합니다.

agree 클릭

 

 

왼쪽 내비게이션 바 CONFIGURATION > VPN Settings로 들어가 사진에 표시되어 있는 부분을 Yes로 바꿔줍니다.

 

스크롤을 쭉 내려서 Save Settings 버튼 클릭 해줍니다.

 

저는 user1으로 생성을 하였고 More Settings을 클릭하여 Password를 입력해주고 스크롤을 내려 Save Settings 버튼을 클릭 합니다.

 

그리고 꼭 Update Running server를 클릭해 줘야 설정값들이 업데이트됩니다.

 

 

3) 위에서 생성한 사용자로 로그인 합니다.

admin을 제외한 주소인 Client UI로 접속해 생성했던 사용자(user1)로 로그인 합니다.

 

접속할 사용자 OS에 맞는 클라이언트를 다운로드 한 뒤 설치 합니다.

 

OpenVPN server IP를 넣어주고 NEXT 버튼 클릭 후 Accept 버튼을 클릭합니다.

 

사용자(user1)을 넣어주고 VPN을 켜줍니다.

 

private ec2 ssh 접속

private ec2 접속이 잘 되는 것을 확인할 수 있습니다.

 

 

4. EIC endpoint를 통한 접속

EC2 인스턴스에 연결하기 위한 엔드포인트로 EC2 웹 콘솔이나 AWS CLI를 통해서 Endpoint에 접근해 인스턴스로 접속할 수 있습니다.

(SSM과의 차이점은 NAT Gateway가 없어도 EIC endpoint를 통해 접속이 가능합니다.)

 

1) VPC endpoint를 생성합니다.

EC2 > 보안그룹 > 보안 그룹 생성

엔드포인트 생성 전에 보안그룹을 먼저 생성합니다. VPC는 private ec2가 있는 vpc를 선택합니다.

(인바운드 규칙은 신경쓰지 않으셔도 좋습니다.)

 

VPC > 엔드포인트 > 엔드포인트 생성

EIC 엔드포인트를 생성합니다. VPC는 private ec2가 있는 vpc를 선택합니다.

 

위에서 생성했던 보안그룹을 선택하고 서브넷은 원하는 곳으로 선택합니다. (private, public 둘 다 가능합니다.)

엔드포인트 생성 버튼을 클릭합니다.

 

엔드포인트가 사용 가능 상태가 된다면, private ec2 접속 가능합니다.

 

 

2) private ec2에 접속합니다.

 

인스턴스 연결을 클릭합니다.

 

EC2 EIC 엔드포인트를 사용하여 연결을 클릭한 뒤 연결 버튼을 클릭합니다.

 

위 이미지와 같은 화면이 확인되면 성공적으로 접속되었음을 알 수 있습니다.

 

 

+) AWS CLI를 활용한 ssh로 접속합니다.

* aws cli 설치 되어있음

 

EIC 터널링 전용 IAM 사용자를 생성하기 위해 정책을 먼저 생성 합니다.

IAM > 정책 > 정책 생성

더보기
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2InstanceConnect",
	    "Effect": "Allow",
	    "Action": "ec2-instance-connect:*",
	    "Resource": "*"
        },
        {
            "Sid": "Describe",
            "Action": [
            "ec2:DescribeInstances",
            "ec2:DescribeInstanceConnectEndpoints"
            ],
        "Effect": "Allow",
        "Resource": "*"
        }
    ]
}

원하는 이름 설정 후 정책 생성

 

EIC 터널링 전용 IAM 사용자를 생성 합니다.

IAM > 사용자 > 사용자 생성

위에서 생성했던 정책을 연결해 사용자를 생성합니다.

 

IAM > 사용자 > 생성한 사용자 > 액세스 키 생성

해당 사용자 인증을 위한 액세스 키를 발급 받습니다.

 

터미널 위에서 ssh 접속을 시도 합니다.

 

생성했던 액세스 키로 aws configure 명령어를 통해 저장 합니다.

 

aws ec2-instance-connect ssh --instance-id <private-ec2-id> --connection-type eice

위의 명령어를 입력합니다.

 

위와 같이 접속한 화면을 확인 할 수 있습니다.

 

* 기본적인 세팅은 되어 있는 상태 입니다. (VPC, Nat GW, ALB, EC2(private subnet) 구성)

* private ec2: etech-private-ec2(10.0.11.130)


1. bastion server를 통한 접속

사용자가 Bastion Server를 통해 private ec2에 ssh 프로토콜을 사용해 접속합니다.

 

1) bastion server를 생성합니다.

 

원하는 이름 설정
원하는 OS 이미지 선택
인스턴스 유형 선택

(t3.nano의 작은 유형으로도 bastion server에는 충분합니다.)

 

키페어 선택
private ec2의 vpc를 선택

vpc의 public subnet을 선택해주시고, public ip 활성화를 선택해줍니다.

보안 그룹은 원하는 이름을 넣어주시고 소스 유형을 "내 IP"로 선택해 관리자만 접속할 수 있게 설정해줍니다.

 

나머지 설정은 디폴트로 두고 인스턴스 시작을 클릭해 생성합니다.

 

 

2) 관리자가 사용하기 편한 ssh 접속 툴을 활용해 bastion server를 통해 private ec2에 접속합니다.

* MobaXterm을 활용했습니다.

 

새로운 session 추가

Remote host는 private ec2의 ip를 넣고 Specify username에는 OS에 맞는 username을 넣어줍니다.

private key는 인스턴스 생성 시 선택했던 key pair를 넣어 주시면 됩니다.

 

Bastion Host 작업을 위해 클릭
bastion server 설정

위에서 생성했던 bastion server의 public ip와 username, port와 ssh key pair를 넣고 세션을 연결합니다.

 

성공적으로 접속하면 아래와 같은 화면을 보실 수 있습니다.

 

2) SSM(System Manager)를 통한 접속

IAM 역할에 SSM 권한을 부여합니다. 그런 다음 해당 IAM 역할을 EC2에 연결하여, private 네트워크에서도 안전하게 접속할 수 있습니다.

 

1) AmazonSSMManagedInstanceCore 역할을 생성합니다.

 

AmazonSSMManagedInstanceCore가 잘 들어갔는지 확인

ssm 연결을 위해 ec2에 필요한 역할을 생성해줍니다.

 

원하는 이름 설정

위 설정이 끝나면 역할 생성을 클릭합니다.

 

 

2) private ec2에 위에서 생성한 역할을 연결해줍니다.

IAM 역할 수정 버튼 클릭

 

위에서 생성한 역할을 선택한 뒤 IAM 역할 업데이트를 클릭합니다.

( 해당 역할을 적용하는 데 시간이 상당히 소요될 수 있습니다. 빠르게 적용시키기 위해 인스턴스를 재부팅하여 시간을 단축시킬 수 있습니다.)

 

3) private ec2 에 접속합니다.

 

연결 버튼 클릭
session manager 연결 클릭

 

위와 같은 화면을 보면 private ec2에 접속 성공한 것을 알 수 있습니다.

Bastion Host에서 Private EC2 Windows로 접속하는 과정 정리를 해보려 한다..

https://dev.classmethod.jp/articles/access-private-ec2-windows-from-bastion-host/

 

위와 같이 구성을 먼저 해두자.

 

 EC2 Windows 의 SG를 바꿔주자.

(소스의 경우 bastion-sg로 지정)

 

MobaXterm으로 접속

Remote host의 경우엔 windows server의 private ip를 적으면 된다.

SSH gateway에는 만들어두었던 bastion host의 public ip와 key pair를 넣어주자.

 

RDP 접속 비밀번호의 경우 인스턴스 연결에서 RDP 클라이언트를 통해 key pair를 넣고 비밀 번호를 받자..

 

접속 성공!


위의 방법 말고도 Fleet Manager를 사용해 연결이 가능하다!

https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet-rdp.html

  • SSM agent 설치가 필요하고 최대 세션 시간은 60분이다! (아니면 세션 종료 전에 갱신을 선택해 타이머를 다시 시작한다)
  • 기본적으로 동일한 AWS 계정 및 AWS 리전에서 최대 5개의 동시 Fleet Manager RDP 연결을 가질 수 있으며 추가 사용을 위해선 할당량 증가를 요청해야함!

'Cloud > AWS' 카테고리의 다른 글

[AWS] Firebase를 AWS Amplify로  (0) 2023.01.04
[AWS] re:Invent 2022 정리  (0) 2022.12.19
[AWS] Serverless Service - DynamoDB 편(4)  (0) 2022.12.08
[AWS] Serverless Service - DynamoDB 편(3)  (0) 2022.12.07
[AWS] Serverless Service - DynamoDB 편(2)  (0) 2022.12.05

 

일단 방법에 뭐가 있는지 생각해보자.

그냥 단순하게 생각해봤을 떄, 제일 먼저 생각 나는 건 lambda이다.

해당 lambda가 인스턴스를 시작/중지 시킬 수 있을 것이다. 그럼 다음으로 생각해봐야 할 것은 lambda를 누가 호출 할 것이냐인데... 이 기준은 사용자가 정하면 된다. 보통 EventBridge로 스케줄링 한다.

 

정리해보면 EventBridge가 Lambda를 호출하고 해당 Lambda가 인스턴스를 중지/시작 시켜 줄 것이다.

이를 잘 활용해서 사용하면 원하는 시간대에 자동으로 시작/중지를 할 수 있을 것 같다!


인스턴스 생성

위와 같은 태그를 가진 인스턴스를 생성해준다.

- auto-schedule: True 인 태그를 가진 인스턴스만 스케줄링

 

Lambda 생성

1) IAM Role과 Policy 생성

Lambda에 EC2 인스턴스 시작 및 종료에 관한 권한이 필요하다.

인라인 정책으로 넣어줬다

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:Start*",
                "ec2:Stop*"
            ],
            "Resource": "*"
        }
    ]
}

2) EC2 start 함수 생성

위에서 만들었던 역할로 연결해줘야한다.

import boto3
region = 'ap-northeast-2'
instances = []
ec2_r = boto3.resource('ec2')
ec2 = boto3.client('ec2', region_name=region)

for instance in ec2_r.instances.all():
    for tag in instance.tags:
        if tag['Key'] == 'auto-schedule':
            if tag['Value'] == 'True':
                instances.append(instance.id)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

제한 시간을 30초로 변경해준다.

그리고 그냥 아무 테스트 만들어서 돌려준다. 성공 로그 뜨면 완료.

 

3) EC2 stop 함수 생성

코드만 바뀌고 다른 과정은 위의 EC2 start 함수와 같다.

import boto3
region = 'ap-northeast-2'
instances = []
ec2_r = boto3.resource('ec2')
ec2 = boto3.client('ec2', region_name=region)

for instance in ec2_r.instances.all():
    for tag in instance.tags:
        if tag['Key'] == 'auto-schedule':
            if tag['Value'] == 'True':
                instances.append(instance.id)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

해당 ec2가 중지 중인걸 볼 수 있음!

 

EventBridge 설정

규칙을 원하는대로 설정해서 생성하면 된다.(월-금 오전 9시 - 오후 6시까지 start, 나머지 stop)

  • 이름: auto-ec2-start-rule / auto-ec2-stop-rule
  • 이벤트 버스: 일단은 default로 진행
  • 규칙 유형: 일정 선택
  • 일정 패턴: cron " 0 0 ? * MON-FRI * " / " 0 9 ? * MON-FRI * " 

  • 대상: AWS 서비스 - lambda 위에서 생성한 함수 지정

시간은 UTC 기준이니 참고!!(00:00 UTC는 한국 시간으로 오전 9시)

'Cloud > AWS' 카테고리의 다른 글

[AWS] Spot Fleet  (0) 2022.11.16
[AWS] Lambda와 RDS Proxy  (0) 2022.11.14
[AWS] GPU 인스턴스 Spot Fleet  (0) 2022.11.12
[AWS] GPU 인스턴스 유형(EC2)  (0) 2022.11.12
[AWS] Lambda에 X-Ray 적용하기  (0) 2022.11.06

+ Recent posts