Scenario

 

1. CodeRepository에 node.js 코드 푸시

2. node.js 코드 ECR로 푸시

3. ECS에서 ECR 컨테이너 지정 후 EC2환경 서비스

4. node.js 코드 실행 확인

 

 

사전 준비

Test Node.js 코드

https://yes5.tistory.com/45

 

Node.js Express 실행 확인 index.html 포함

Node.js 설치먼저, Node.js를 설치해야 합니다.Node.js 다운로드:Node.js 공식 웹사이트로 이동합니다.LTS (Long Term Support) 버전을 다운로드합니다. 이는 안정적이고 장기적으로 지원되는 버전입니다.Node.js

yes5.tistory.com

 

AWS CLI 설치 및 구성

  • AWS CLI가 설치되어 있지 않다면, AWS CLI 설치 가이드를 참고하세요.
  • AWS CLI를 설치한 후, 다음 명령어를 사용하여 AWS 자격 증명을 구성합니다:
aws configure

1. KEYID
2. PASSWORD
3. REGION (ap-northeast-2)
4. 생략 enter

 

Git 설치

  • Git이 설치되어 있지 않다면, Git 다운로드 페이지에서 설치하세요.

Docker 설치 및 설정

https://yes5.tistory.com/46

 

Docker 설치 및 설정 deploying WSL2 distributionsensuring main distro is deployed error 해결

1. Docker 설치Docker는 대부분의 운영 체제에서 설치할 수 있습니다. 아래는 주요 운영 체제별 설치 방법입니다.WindowsDocker Desktop for Windows를 다운로드하고 설치합니다.설치 과정에서 기본 설정을 따

yes5.tistory.com

 

 

AWS CodeCommit 리포지토리 생성

  • AWS Management Console 또는 AWS CLI를 사용하여 리포지토리를 생성할 수 있습니다.

 

IAM 사용자 생성 및 권한 부여

  • AWS Management Console에서 IAM 사용자에게 CodeCommit에 접근할 수 있는 권한을 부여하세요. 사용자에게 AWSCodeCommitFullAccess 정책을 추가하면 됩니다.

 

HTTPS Git 자격 증명 생성 (선택 사항)

  • AWS Management Console의 IAM 서비스에서 "HTTPS Git 자격 증명"을 생성하여 사용자의 Git 자격 증명을 설정할 수 있습니다. 이 자격 증명을 사용하면 Git 명령을 통해 AWS CodeCommit에 접근할 수 있습니다.
  • https://yes5.tistory.com/42
 

AWS code repository 생성 git

https://git-scm.com/download Git - DownloadsDownloads macOS Windows Linux/Unix Older releases are available and the Git source repository is on GitHub. GUI Clients Git comes with built-in GUI tools (git-gui, gitk), but there are several third-party tools

yes5.tistory.com

 

로컬 Git 리포지토리 설정 및 푸시

기존 프로젝트가 있는 경우:

  • 기존 프로젝트 디렉토리로 이동하여 Git 리포지토리를 초기화하고 원격 리포지토리를 추가합니다.
cd /path/to/your/local/repo
git init
git remote add origin https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/my-express-app

 

새 프로젝트를 시작하는 경우:

  • 새로운 디렉토리를 생성하고 Git 리포지토리를 초기화한 후, 원격 리포지토리를 추가합니다.
mkdir my-express-app
cd my-express-app
git init
git remote add origin https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/my-express-app

git config --global user.email "you@example.com"
git config --global user.name "Your Name"
  • Git을 처음 설정할 때 사용자 이름과 이메일 주소를 지정해야 합니다. 이 정보를 사용하여 커밋을 할 때 작성자가 누구인지 식별합니다.

 

변경 사항 커밋 및 푸시:

  • 파일을 추가하고 커밋한 후, 변경 사항을 AWS CodeCommit 리포지토리에 푸시합니다.
git add .
git commit -m "Initial commit"

# master 브랜치 생성 및 리모트에 푸시
git branch -M master
git push -u origin master

 

Dockerfile 작성

먼저, Express 애플리케이션을 Docker 컨테이너로 빌드할 수 있도록 Dockerfile을 작성해야 합니다. 프로젝트 루트 디렉토리에 Dockerfile을 추가합니다.

# Node.js 이미지를 기반으로 합니다
FROM node:18

# 작업 디렉토리를 설정합니다
WORKDIR /app

# 패키지 파일들을 컨테이너로 복사합니다
COPY package*.json ./

# 의존성 패키지를 설치합니다
RUN npm install

# 애플리케이션 소스 파일들을 컨테이너로 복사합니다
COPY . .

# 애플리케이션이 실행될 포트를 설정합니다
EXPOSE 3000

# 애플리케이션을 실행합니다
CMD ["node", "index.js"]

 

Docker 이미지 빌드:

Docker 이미지를 빌드합니다:

docker build -t my-express-app .

 

Docker 이미지 실행 (로컬 테스트):

로컬에서 Docker 컨테이너를 실행하여 애플리케이션이 잘 작동하는지 확인합니다:

docker run -p 3000:3000 my-express-app

 

 

AWS ECR(Elastic Container Registry) 설정

ECR 리포지토리 생성:

AWS 관리 콘솔에 로그인하고 ECR 서비스로 이동하여 새 리포지토리를 생성합니다.

 

ECR 로그인:

AWS CLI를 사용하여 ECR에 로그인합니다:

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <YOUR_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com
# <YOUR_ACCOUNT_ID> 입력

 

Docker 이미지 태깅 및 푸시:

ECR 리포지토리에 Docker 이미지를 태깅하고 푸시합니다:

docker tag my-express-app:latest <YOUR_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com/my-express-app:latest
docker push <YOUR_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com/my-express-app:latest

# <YOUR_ACCOUNT_ID> 입력

 

ECR에 푸시 된 컨테이너 이미지

 

 

AWS ECS(Elastic Container Service) 설정

ECS 클러스터 등록

  •  이름만 지정하여 클러스터를 생성합니다.

 

IAM 역할 생성

IAM 역할은 ECS 인스턴스가 ECS와 통신할 수 있도록 필요한 권한을 제공합니다.

  • AWS Management Console에서 IAM으로 이동합니다.
  • 역할을 선택하고, 역할 생성을 클릭합니다.
  • EC2를 선택하여 EC2 인스턴스에 사용할 역할을 생성합니다.
  • 정책을 추가하여 ECS 관련 권한을 설정합니다. 필요한 권한은 AmazonEC2ContainerServiceforEC2Role 정책을 포함합니다.
  • 역할을 생성한 후, 역할의 IAM 역할 ARN을 기록해 둡니다.

 

인스턴스에 ECS 에이전트 설치:

  • ECS-optimized AMI를 사용하는 경우, ECS 에이전트가 이미 설치되어 있습니다. ECS-optimized AMI는 Amazon Linux 2 또는 Windows Server AMI로 제공됩니다.
  • EC2 인스턴스를 시작할 때, ECS-optimized Amazon Linux 2 AMI를 선택하여 인스턴스를 생성합니다.

https://aws.amazon.com/marketplace/pp/prodview-do6i4ripwbhs2

 

AWS Marketplace: Amazon ECS-Optimized Amazon Linux 2 (AL2) x86_64 AMI

Operating System Linux/Unix, Amazon Linux 2.0.20240709

aws.amazon.com

위 AMI의 Software Price는 무료입니다. 다른 AMI 사용시 Software 요금이 부과될 수 있습니다.

 

 

EC2 인스턴스를 생성할 때 고급 세부 정보에 IAM 인스턴스 프로파일을 생성해놓은 IAM role으로 선택합니다.

사용자 데이터에 해당 명령문을 입력합니다.

#!/bin/bash
echo ECS_CLUSTER=my-express-app >> /etc/ecs/ecs.config

#my-express-app은 ECS클러스터의 이름으로 클러스터 이름과 맞게 입력합니다.

 

 

ECS Task definition

  •  Json을 사용하여 새 테스크 정의를 생성합니다.

{
  "family": "my-express-app",
  "containerDefinitions": [
    {
      "name": "my-express-app",
      "image": "431997274392.dkr.ecr.ap-northeast-2.amazonaws.com/my-express-app:latest",
      "memory": 256,
      "memoryReservation": 128,
      "cpu": 128,
      "portMappings": [
        {
          "containerPort": 3000,
          "hostPort": 3000,
          "protocol": "tcp"
        }
      ]
    }
  ],
  "cpu": "256",
  "memory": "512",
  "networkMode": "bridge",
  "requiresCompatibilities": ["EC2"]
}
  • Task memory와 cpu 할당을 생성한 인스턴스(t3.micro 2 vCpu, 1GB RAM )이하로 설정해야합니다. 
  • container memory와 cpu 할당은 Task 할당 이하로 설정해야합니다.

 

ECS Cluster Task 실행

  • Task definition에서 정의한 패밀리와 시작유형을 EC2로 지정합니다.

 

ECS Cluster 실행 확인

  • Task가 실행중으로 변경되면, ECS cluster에 배정된 인스턴스ip:3000포트로 확인합니다. ( http:// ) ( https:// )

Git

Git 설치는 운영 체제에 따라 다릅니다. 아래에 Windows, 그리고 Linux에 대한 설치 방법을 설명합니다.

 

Windows

  1. Git 공식 사이트에 접속하여 최신 Git 설치 파일을 다운로드합니다.
  2. 다운로드한 설치 파일을 실행합니다.
  3. 설치 마법사의 지시에 따라 설치를 진행합니다. 대부분의 경우 기본 설정을 사용해도 무방합니다.
  4. 설치가 완료되면, 명령 프롬프트나 Git Bash를 열어 Git이 제대로 설치되었는지 확인합니다

Linux

  1. sudo yum update -y
  2. sudo yum install git -y
  3. sudo yum install awscli -y

 

IAM 사용자의 보안 자격 증명

  1. AWS Management Console에 로그인합니다.
  2. IAM 서비스로 이동합니다.
  3. 사용자 목록에서 보안 자격 증명을 관리할 사용자를 선택합니다.
  4. 사용자 세부 정보 페이지에서 "보안 자격 증명" 탭을 클릭합니다.
  5. 여기서 액세스 키, 비밀번호, MFA 설정 등을 관리할 수 있습니다.
  6. HTTPS 인증을 위해 HTTPS Git credential for AWS CodeCommit의 credential을 생성합니다.

 

 

 

 

AWS CodeCommit에서 새로운 리포지토리를 생성

  1. CodeCommit 서비스로 이동합니다. 상단 검색 창에 "CodeCommit"을 입력하고 선택합니다.
  2. 리포지토리(Repositories) 섹션으로 이동합니다. 왼쪽 메뉴에서 "리포지토리(Repositories)"를 클릭합니다.
  3. 리포지토리 생성(Create repository) 버튼을 클릭합니다.
  4. 리포지토리 정보를 입력합니다. 리포지토리 이름과 선택 사항으로 설명을 입력합니다.
  5. 리포지토리 생성(Create repository) 버튼을 클릭하여 완료합니다.

 

 

AWS CodeCommit 리포지토리 클론 및 Git Credential Manager 설정

1. AWS CodeCommit 리포지토리 클론 명령 복사:

  • CodeCommit 서비스로 이동합니다.
  • 리포지토리 목록에서 클론할 리포지토리를 선택합니다.
  • 리포지토리 세부 정보 페이지에서 "클론 URL(Clone URL)" 섹션을 찾습니다.
  • "HTTPS" URL을 선택하고 해당 URL을 복사합니다. 예: https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/my-repo.

2. 로컬 컴퓨터에서 Git 실행:

  • 로컬 컴퓨터에서 터미널(또는 명령 프롬프트)을 엽니다.
  • 리포지토리를 클론할 디렉토리로 이동합니다. 예: cd ~/my-projects.

3. 클론 명령 실행:

4. Git Credential Manager를 사용하여 자격 증명 입력:

  • 클론 명령을 실행하면 사용자 이름과 비밀번호를 입력하라는 메시지가 나타납니다.
  • 사용자 이름에는 IAM에서 생성한 Git 자격 증명의 사용자 이름을 입력합니다.
  • 비밀번호에는 IAM에서 생성한 Git 자격 증명의 비밀번호를 입력합니다.

 

 

 

Amazon Linux AMI 2018 EOS로 php 기반 서버들의 OS udate가 요구됨

Amazon linux2 EC2 생성

 

 

apache 설치

sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl status httpd

 

php 5.4.16 설치

sudo amazon-linux-extras install epel -y
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum-config-manager --enable remi-php56
sudo yum install -y php php-cli php-common php-devel php-mbstring php-xml php-mysqlnd
sudo systemctl restart httpd
php -v

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

http://hostaddress/info.php

 

sudo rm /var/www/html/info.php

 

php 5.4.16 > php 5.6.40 변경

sudo yum remove php php-cli php-common php-devel php-mbstring php-xml php-mysqlnd -y
sudo amazon-linux-extras install epel -y
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

 

sudo vi /etc/yum.repos.d/remi.repo

[remi]
name=Remi's RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/
mirrorlist=https://rpms.remirepo.net/enterprise/7/remi/mirror
enabled=1
priority=1
gpgcheck=1
gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi

[remi-php56]
name=Remi's PHP 5.6 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php56/$basearch/
mirrorlist=https://rpms.remirepo.net/enterprise/7/php56/mirror
enabled=1
priority=1
gpgcheck=1
gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi

remi와 remi-php56 항목에 priority=1 추가

 

sudo yum install -y php php-cli php-common php-devel php-mbstring php-xml php-mysqlnd

php -v

 

vi /etc/php.ini

short_open_tag = ON

 

postgresql 13버전 설치

yum update -y

 

cd > [to workspace]

 

wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

 

yum install -y pgdg-redhat-repo-latest.noarch.rpm

 

sudo yum install -y postgresql13 postgresql13-server

 

sudo /usr/pgsql-13/bin/postgresql-13-setup initdb

 

sudo systemctl start postgresql-13

 

sudo systemctl enable postgresql-13

 

 

postgresql 계정 설정

sudo -i -u postgres

psql

CREATE USER testuser WITH PASSWORD 'test2020@' ;

ALTER USER testuser WITH SUPERUSER ;

\du

 

database 생성

CREATE DATABASE test OWNER testuser ;

GRANT ALL PRIVILEGES ON DATABASE test TO testuser ;

\l 

 

접속 권한 설정

sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/pgsql/13/data/postgresql.conf

echo "host    all             all             0.0.0.0/0               md5" | sudo tee -a /var/lib/pgsql/13/data/pg_hba.conf

 

 

postgresql 설정 적용 재실행

sudo systemctl restart postgresql-13

sudo systemctl status postgresql-13

 

 

Dbeaver 등 tool을 이용 접속 확인

 

sudo yum install epel-release (CentOS)

sudo amazon-linux-extras install epel (Amazon linux2)

 

 

AWS

VPC - Internet gateways, NAT gateways, Route tables, Subnets

VPC Security - Network ACLs

EC2

 

 

1. VPC 생성

name : test-vpc

CIDR : 10.90.0.0/16

 

2. Internet gateway 생성

Internet gateway

name : test-igw

 

Internet gateway vpc connect

vpc 연결 : test-vpc

 

 

3. Private Subnet, Public Subnet 생성

Private Subnet-01

vpc : test-vpc

name : test-pri-sub01

CIDR : 10.90.10.0/24

Availability Zone : ap-northeast-2b

 

Public Subnet-01

vpc : test-vpc

name : test-pub-sub01

CIDR : 10.90.1.0/24

Availability Zone : ap-northeast-2a

 

Public Subnet-02

vpc : test-vpc

name : test-pub-sub02

CIDR : 10.90.3.0/24

Availability Zone : ap-northeast-2b

 

 

4. NAT gateway 생성

NAT gateway

name : test-natGateway

 

subnet

test-pub-sub01

 

Allocate Elastic IP address

할당 받은 IP를 생성한 NAT gateway에 배정

 

 

5. Route table 설정

Private Route table

vpc : test-vpc

name : test-routeTable-pri

explicit subnet association : test-pri-sub01

 

routes

0.0.0.0/0 - NAT gateway

10.90.0.0/16 local

 

 

Public Route table

vpc : test-vpc

name : test-routeTable-pub

explicit subnet association : test-pub-sub01

 

routes

0.0.0.0/0 - Internet gateway

10.90.0.0/16 local

 

6. Network ACLs 설정

Private Network ACL

Inbound Rules:

100 HTTP TCP 80 0.0.0.0/0 DENY
110 HTTPS TCP 443 0.0.0.0/0 DENY
120 SSH TCP 22 0.0.0.0/0 DENY
130 Ephemeral TCP 1024-65535 0.0.0.0/0 ALLOW
140 Custom Rule TCP 80 Subnet Range ALLOW
150 Custom Rule TCP 443 Subnet Range ALLOW
160 Custom Rule TCP 22 Subnet Range ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY

Outbound Rules:

100 HTTP TCP 80 0.0.0.0/0 ALLOW
110 HTTPS TCP 443 0.0.0.0/0 ALLOW
120 Ephemeral TCP 1024-65535 0.0.0.0/0 ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY

여기서 "Subnet Range"는 사용 중인 서브넷의 IP 주소 범위를 의미합니다. 여기선 10.90.10.0/24

 

Public Network ACL

Inbound Rules:

100 HTTP TCP 80 0.0.0.0/0 ALLOW
110 HTTPS TCP 443 0.0.0.0/0 ALLOW
120 SSH TCP 22 0.0.0.0/0 ALLOW
130 Ephemeral TCP 1024-65535 0.0.0.0/0 ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY

Outbound Rules:

100 HTTP TCP 80 0.0.0.0/0 ALLOW
110 HTTPS TCP 443 0.0.0.0/0 ALLOW
120 Ephemeral TCP 1024-65535 0.0.0.0/0 ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY

 

7. Test EC2 생성 

 

ssm-pub 인스턴스를 public 서브넷에 생성

ssm-pri 인스턴스를 private 서브넷에 생성, Key 생성(ssm-test) 후 배정

 

 

ssm-pub 인스턴스에서 ssm-pri ssh 접속

ssh -i /home/ohsung/ssm-test.pem ec2-user@10.90.10.236

 

private subnet에 있는 ssm-pri 인스턴스에서 NAT gateway를 통해 인터넷 통신 확인

AWS

lambda

cloud Watch - event bridge

IAM

 

Etc

slack

 

 

1. IAM role 생성

AmazonEC2ReadOnlyAccess 정책 배정

 

 

2. lambda function생성

Runtime - Python 3.9

Permissions - 1번에서 만든 role 사용

 

  • code 작성 ( local 환경 )

Lambda 함수에서 `requests` 모듈을 사용하는 경우, 해당 모듈을 포함한 배포 패키지를 만들어야 합니다. Lambda는 기본적으로 `requests` 라이브러리를 포함하지 않으므로, 직접 포함시켜야 합니다.

mkdir lambda_function
cd lambda_function
pip install requests -t .
import boto3
import json
import os
import requests

def lambda_handler(event, context):
    # EC2 클라이언트 생성
    ec2 = boto3.client('ec2')
    
    # 사용 가능한 EBS 볼륨 찾기
    volumes = ec2.describe_volumes(
        Filters=[
            {
                'Name': 'status',
                'Values': ['available']
            }
        ]
    )
    
    available_volumes = volumes['Volumes']
    
    # 사용 가능한 EBS 볼륨이 있는지 확인
    if not available_volumes:
        print("No available volumes found.")
        return
    
    # 사용 가능한 EBS 볼륨 정보 생성
    volume_info = ""
    for volume in available_volumes:
        volume_info += f"Volume ID: {volume['VolumeId']}, Size: {volume['Size']} GiB, Availability Zone: {volume['AvailabilityZone']}\n"
    
    # 사용 가능한 EBS 볼륨 정보 출력
    print("Available volumes:\n", volume_info)
    
    # Slack Webhook URL
    slack_webhook_url = os.environ['SLACK_WEBHOOK_URL']
    
    # Slack으로 메시지 전송
    slack_message = {
        'text': f"Available EBS Volumes:\n{volume_info}"
    }
    
    response = requests.post(slack_webhook_url, data=json.dumps(slack_message), headers={'Content-Type': 'application/json'})
    
    if response.status_code != 200:
        raise ValueError(f"Request to Slack returned an error {response.status_code}, the response is:\n{response.text}")
    
    return {
        'statusCode': 200,
        'body': json.dumps('Slack message sent successfully!')
    }

 

  • .zip으로 압축
zip -r ../lambda_function.zip .

 

  • zip 파일 업로드

 

  • Slack app 생성 ( SLACK_WEBHOOK_URL )
  1. Slack API 페이지에 접속합니다.
  2. "Create a Slack App"을 클릭합니다.
  3. App 이름과 Development Slack Workspace를 선택하고 "Create App"을 클릭합니다.
  4. "Incoming Webhooks"을 활성화합니다.
  5. "Add New Webhook to Workspace"을 클릭하고, Webhook을 보낼 채널을 선택합니다.
  6. Webhook URL을 복사해 둡니다

 

  • lambda 환경 변수에 `SLACK_WEBHOOK_URL` 등록

 

  •  Slack 채널 추가 및 앱 등록 후 lambda code test

 

  • cron 등록

cloud watch -> events -> rules -> create rule -> rule type ( schedule ) -> continue in EventBridge Scheduler

 

cron(0 0 ? * 2 *)

0 0은 00:00 (자정)을 의미하고, ?는 특정한 일자를 지정하지 않음을 의미합니다. * * 2 *은 매주 월요일을 나타냅니다.

 

+ Recent posts