Ec2 스케줄링 작업

Ec2 서버를 항상 켜두지 않아도 될시 스케줄링을 통한 인스턴스의 비용을 줄이자
참고 문헌 : https://aws.amazon.com/ko/premiumsupport/knowledge-center/start-stop-lambda-eventbridge/ 
 

Lambda를 사용하여 EC2 인스턴스를 설정 간격으로 중지 및 시작하기

EC2 인스턴스를 자동으로 중지 및 시작하여 Amazon Elastic Compute Cloud(Amazon EC2) 사용량을 줄이려고 합니다. 이를 위해 AWS Lambda 및 Amazon EventBridge를 사용하려면 어떻게 해야 하나요? 중요: 리전에서 ‘us

aws.amazon.com

테스트 

1. Lambda 사용할 IAM 생성

Lambda를 사용하여 ec2를 제어해야 하므로, Lambda에서는 Ec2에 대한 목록확인,시작 및 종료 권한이 필요합니다.

Lambda함수에서 ec2에 대한 start/stop 동작을 하게끔 하기위한 정책부여

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

 

2. Tag 기반으로 Ec2 생성

특정 tag를 사용해서 인스턴스를 동작시킬것이기 때문에 tag를 지정해준다.나머지 값은 기본으로 생성했으므로 스킵한다(key는 본인의 key를 이용)

 

3. Lambda 함수 생성 

  • 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))
  • stop 함수
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))

Start Ec2 Function

코드 배포 시간 20초로 수정
코드 배포 후 Test 진행

Stop Ec2 Function

start 함수와 동일하게 설정 진행
코드 작성 후 배포 진행

TEST 확인

Start
Stop

4. EventBridge 생성

기존 Cloudwatch Event 가 Event Bridge와 통합이 되어 UI만 다른 점 참고!!
  • 규칙 세부 정보

  • Cloudwatch를 이용하여 특정 시간 조정

Cron 작업을 이용하여 동작시킨다. 해당 시간은 한국시간 UTC - 9 로 기입을 해야한다.                                     다음 테스트는 월~금 15:38분으로 설정된것이다.
특정 시간 Event 패턴에 따른 Lambda Ec2 start 함수 시작 연동

  • 람다 이벤트 트리거 연동 확인

  • 동작 확인 (실행)

위에서 중지 되어있던 인스턴스 재실행 확인(중지 또한 동일하게 확인하면 된다)

5. 추가

 위의 과정을 이용하여 특정 시간대에 따른 Ec2 서버의 시작과 중지가 이루어 졌다..
 하지만, 수동으로 중지시간에 인스턴스를 강제로 구동 시킬 시 자동으로 중지가 되지 않기 때문에 해당 방법또한  추가로 구현해보았다.

Auto Stop Function

import boto3
from datetime import datetime
from datetime import time
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):
    curr_datetime = datetime.now()
    curr_time = curr_datetime.time()

    if (curr_time.hour >= 7): 
        if len(instances) > 0:
        #perform the shutdown
            ec2.stop_instances(InstanceIds=instances)
        
            print('stopped your instances: ' + str(instances))

EventBridge를 이용하여 시작중인 인스턴스 대상으로 트리거

  • 인스턴스 수동 재시작

이전 챕터에서 진행된 Stop 함수 EventBridge 특정 시간에 따라 중지됨을 확인

  • 수동 시작 진행 시 

강제로 시작을 진행하였을시, AutoStop함수에 의하여 다시 중지가 되는것을 확인할 수 있다.

 

결과

해당 테스트를 통하여 Lambda 함수 작성을 통한 Ec2 의 스케줄링 작업을 해보았으며,
주 서비스가 아닌 서버들에 한해서 유휴 리소스를 줄이기 위해 사용한다면 유용할 것 같다.
더나아가 해당 설정들을 CloudFormation 이나 Terraform을 이용한다면 좀더 유연한 작업이 될 것이다.

 

'Automation' 카테고리의 다른 글

SSM Automation을 통한 자동화  (0) 2022.08.23
image builder 2  (0) 2021.06.16
Image Builder -golden ami 생성  (0) 2021.03.29
auto-scaling scale-out시 run-command동작  (0) 2021.03.29
VPN이란?

VPN(Virtual Private Network)은 인터넷으로 연결된 두개의 다른 네트워크에 있는 호스트들 간의 통신을 암호화된 연결방식으로 전송해서 마치 동일한 네트워크에 있는것처럼 안전한 통신을 할수있게 해줍니다.

일반적으로 AWS환경에 있는 VPC와 On-premise 데이터센터간의 통신이 필요 시 AWS Site-to-Site VPN을 이용하여 쉽고 안전하게 연결할 수 있습니다. AWS Direct Connect를 이용해서 AWS Network와 On-premise 데이터 센터를 물리적으로 연결하는 방법도 존재하나 비용이 상당히 요구된다.

이번 포스팅에서는 Openswan을 이용한 AWS Site-to-Site VPN을 테스트 해보겠습니다.

아키텍처

해당 과정에서 public subnet으로 설정했어도 private ip로는 접근이 안되므로 편의상 public으로  두었으며, CGW를 생성하는 과정에 public IP를 지정해주어야 하기때문에 public ec2 2대를 생성하여 테스트 , CGW용으로 사용할것이다.

기본 구성 

1. vpc 생성

2. IGW 생성

VPC랑 연결해야함

3. 서브넷 생성

4. RT 생성 및 등록

모든 서브넷은 public으로 편의상 두었으며 ping테스트 시 해당 서버의 private으로 테스트 하면되기때문에 상관없다.     또한, CGW를 생성하기 위해서는 On-premise쪽은 public ip가 필요하다

5. 인스턴스 생성                                                                                                      

 

VGW(가상 프라이빗 게이트웨이)

VPC Service로 이동하여 좌측 하단 VGW생성

위에서 생성한 AWS-VPC와 연결

CGW(customer-gateway)

동일하게 VPC service를 통하여 접근

Onprem-vpn 인스턴스의 public IP를 지정해준다.

VPN생성

VPC service의 Site-to-Site VPN을 통해 생성

On-premise에서 설정한 vpn 설정 파일 다운

Openswan 설정 및 테스트

sudo yum -y install openswan
<openswan 설정 파일 생성>
sudo vi /etc/ipsec.d/aws.conf

conn Tunnel1
	authby=secret
	auto=start
	left=%defaultroute
	leftid=15.165.235.204   #customer gateway IP
	right=3.34.64.185       #AWS VPN Tunnel 1 IP
	type=tunnel
	ikelifetime=8h
	keylife=1h
	phase2alg=aes128-sha1;modp1024
	ike=aes128-sha1;modp1024
	keyingtries=%forever
	keyexchange=ike 
	leftsubnet=<LOCAL NETWORK> #On-premise VPC
	rightsubnet=<REMOTE NETWORK>  #AWs VPC
	dpddelay=10
	dpdtimeout=30
	dpdaction=restart_by_peer
    overlapip=yes


conn Tunnel2
	authby=secret
	auto=start
	left=%defaultroute
	leftid=15.165.235.204    #Customer gateway ip
	right=52.79.137.110      #aws vpn tunnel ip
	type=tunnel
	ikelifetime=8h
	keylife=1h
	phase2alg=aes128-sha1;modp1024
	ike=aes128-sha1;modp1024
	keyingtries=%forever
	keyexchange=ike
	leftsubnet=<LOCAL NETWORK>   #On-premise VPC
	rightsubnet=<REMOTE NETWORK> #AWS VPC
	dpddelay=10
	dpdtimeout=30
	dpdaction=restart_by_peer
    overlapip=yes -> 다중 터널시 cgw의 ip중복허용
  
  
sudo vi /etc/ipsec.d/aws.secrets
<CUSTOMER_GATEWAY_IP> <TUNNEL1_IP>: PSK "<TUNNEL1 PSK>"
<CUSTOMER_GATEWAY_IP> <TUNNEL2_IP>: PSK "<TUNNEL2 PSK>"
> 해당 정보는 다운받은 파일에서 확인가능합니다.

<ip forward 설정>
sudo vi /etc/sysctl.conf

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0

<서비스 시작>
sudo service network restart
sudo service ipsec restart

 

설정 확인 및 동작

위에서 설정이 정상적일시 다음과 같이 vpn tunnel 작동 확인

라우팅 수정

On-premise 라우팅 설정 CGW를 통해서 대상으로 간다.
AWS측 라우팅 설정 Vgw를 통해서 나간다.

보안그룹 설정

CGW로 사용중인 VPN인스턴스에 대한 Inbound
On-premise ec2에 대한 Inbound
AWS ec2에 대한 Inbound

동작 확인 - ping 통신

On-premise -> AWS
AWS -> On-premise

 

'aws' 카테고리의 다른 글

Elastisearch 를 사용 VPC FLOWLOGS  (0) 2021.03.29
CloudWatch / SSM Agent  (0) 2021.03.29
lb -acm 인증서를 이용한 접속  (0) 2021.02.09
route 53 도메인 연결  (0) 2021.02.09
RDS-multi AZ/RR 구성 실습  (0) 2021.02.03

+ Recent posts