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 *은 매주 월요일을 나타냅니다.

 

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 인스턴스만 실행된 것 확인

+ Recent posts