태그 Archives: AWS

S3 버킷 CORS 설정 (json)

S3 의 CORS 설정이 기존 XML 방식에서 Json 방식으로 변경이 되었다 ‘ㅅ’a

웹콘솔에서 s3 버킷을 선택 하고 관리 탭의 하단에 있다.

사실 문법만 틀리겠지만 미리 정리를 해본다.

 

다음은 가장 일반적인 형태의 자신의 도메인 주소를 추가 하는 방법이다.

 

IDE를 가지고 개발하는 경우.. 개발자 PC 에서 웹서버가 자주 실행하고 테스트 해야 된다면 아래와 같이 localhost:* 을 추가 한다.

 

모든 곳에 허용(메일 삽입 이미지 등등) 하는 것은 Origin 설정을 * 으로 하면 된다 ‘ㅅ’a

 

AllowedMethods 는 GET, POST, HEAD, PUT, DELETE 를 지정 할수 있다.

 

PS. 터미널에서 curl 으로 CORS 검사는 아래와 같이 할 수 있다.

 

AWS 상에서의 API Gateway – Lambda – python – pymysql – rds(mariadb) 구현

aws 에서는 API Gateway 를 제공 한다.

이는 serverless 기반의 API 생성 및 운영을 손쉽게 할 수 있는 서비스 이다. (근데 손쉽지 않더라..)

물론 굉장히 난해 하고 어렵지만 처음 한걸음은 항상 어려 웠다 ‘ㅅ’a (이 산을 넘으면 devops 가 되는 첫걸음이 된다.)

 

aws-api-lambda-python-rds

위 이미지 생성은 클라우드크래프트 (https://cloudcraft.co/) 에서 진행 하였다. (AWS 아키텍쳐를 짜는데 매우 유용함.)

 

즉 restful API 를 AWS 상에서 API gateway 와 Lambda 서비스를 이용하여 구축 하여 운영하는 것이다.

이미 이와 같은 많은 글을 참고 하였으나 대부분 아마존에서 제공 하는 nodojs 를 활용하는 방법만 존재 하더라…


1. Lambda 에서 함수를 생성 한다.

2020-08-07_154033


2. 함수가 생성 되면 기본 설정에서 함수의 제한 등을 확인할 수 있다.

핸들러의 의미는 함수가 실행되었을때 lambda_function.py 한의 def lambda_handler() 를 실행한다는 의미가 된다.

(물론 편집도 된다. DB 접근 시간이 있기 때문에 제한시간을 10~15초로 늘린다.)

2020-08-07_162631


3. 스크롤을 올려 보면 AWS Cloud 9 IDE 의 간소화 버전을 이용하여 수정을 할 수 있다.

2020-08-07_163001


4. Test 버튼을 눌러 테스트 셋을 생성 한다. (이미지는 없음)

테스트를 위한 좀더 많은 json 은 https://github.com/awsdocs/aws-lambda-developer-guide/blob/master/sample-apps/nodejs-apig/event.json 에서 확인할 수 있다.

다시 TEST 버튼를 눌러보면 실행 API Gateway 에 연결 되었을때 실행 후 결과 값이 확인 된다.

2020-08-07_164220

함수 생성이 완료 되었지만 Hello World 를 보려고 이것을 하는게 아니기 때문에 API의 근본 목적인 데이터베이스 접속을 할 차례이다 ‘ㅅ’a


배포용 코드 작성은 AWS cloud 9 IDE 를 통해 작성을 할 예정이다. (일반적인 linux 나 windows 환경에서도 가능하다.)

물론 Cloud 9 을 통해 lambda 배포가 가능하지만 단순 소스 작성을 위해서만 이용할 예정 이다 ‘ㅅ’a  (이걸 하려면 또 Cloud Fomation 을 해야 하기 때문에…)

Lambda 에서는 일부 json, logging 등을 별다른 설정 없이 import 할 수 있지만 pymysql 과 같은 서버에 별도 설치가 필요한 부분은 같이 업로드가 되어야 한다.

때문에 아래와 같이 pymysql 설치를 한다.

db 정보를 저장할 dbinfo.py 파일과 AWS lambda 핸들러에서 지정된 lambda_function.py 파일을 같이 생성 한다.

위와 같이 작성을 하고 zip 파일로 압축을 한다.

압출한 파일을 AWS 웹콘솔 에서 업로드 한다.

2020-08-07_173321

zip 파일이 압축 해제가 되며 lambda001 아래에 파일 및 폴더가 위치 할 수 있는데 아래와 같이 드래그 앤 드롭으로 맞추어 준다.

아니면 기본설정-핸들러를 lambda_function.lambda001.lambda_handler 으로 바꾸어도 될꺼 같기도 하다 ‘ㅅ’a

2020-08-07_174505


데이터베이스의 경우 보안 때문에 IP를 막고 일부만 열어서 서비스 하는것이 일반적이기 때문에 실행하는 람다를 VPC 내에서 실행 되게 해야 한다.

그래서 생성한 lambda 함수가 자신의 VPC 에서 네트워크 인터페이스를 사용할 수 있는 권한을 주어야 한다.

2020-08-07_175052

화면 최상단의 권한 으로 이동하고 실행 역할(IAM role) 을 눌러 해당 정책에 정책 추가를 진행해야 한다.

아래의 권한으로 정책을 새롭게 생성해서 연결 해도 되고 인라인 정책 추가를 해도 된다.

추후 생성되는 Lambda 함수는 권한 부분에서 기존 역할로 이미 VPC 권한이 부여된 역할을 선택 해주면 좀더 편하게 사용할 수 있겠다.

2020-08-07_175631


lambda 실행될 VPC 에 대한 정보를 설정해 주어야 한다.

2020-08-07_180250

2020-08-07_180507

사용자 지정 VPC 지정과 VPC 지정 subnet 지정(2개 이상) 과 EC2보안그룹을 지정 하면 된다.


그리고 RDS 서버의 보안그룹에서 위에서 lambda 가 사용할 것으로 지정된 두개의 서브넷(172.31.0.0/20, 172.31.16.0/20)을 허용한다.

2020-08-10_113634


테스트를 달려 본다.

2020-08-07_181235

앗싸 가오리!


너무 길어져서 API 게이트웨이는 나중에 추가 할 예정이다 =_=a

팔로우 할때 주의 할점은 API 게이트 웨이의 리소스 > 메소드 에서 “통합 요청”의 유형이 LAMBDA 가 아닌 LAMBDA_PROXY 으로 해야 하는 python 코드 이다.

aws ubuntu 18.04 자동 업데이트 끄기

aws 에서 서버운영을 하는데

가장 작은 디스크 크기 8GB 으로 생성하고 1년정도 운영을 했을때 디스크가 초반에 4.XX GB만 사용이 되다가 점점 사용량이 증가 되었음 ‘ㅅ’a

 

ubuntu 의 경우 자동 업데이트로 꾸준히 커널을 업데이트 하기 때문에 발생하는 문제이고

특정한 서비스 포트만 열고 서비스 하는 서버이기 때문에 업데이트가 필요 없다고 판단되어 자동업데이트를 끄는 것으로…

 

이후 apt-get 을 이용하여 불필요한 패키지를 삭제한다 ‘ㅅ’a

 

linux-headers가 업데이트가 된 경우 재 부팅 이후에 autoremove를 해야할 수 있다.

혹은 너무 쌓여서 broken 이 된경우 /usr/src 에서  사용되고 있는 headers 를 제외하고 삭제를 해야 할 수 있겠다 ‘ㅅ’a

AWS 인스턴스 시작, 중지 스크립트

aws cli 명령어를 이용하여 ec2 서버를 껏다 켰다 하는 스크립트 이다.

일반 환경에서는 불필요 하고 개발 환경의 서버를 24/7 을 켜둘 이유가 없다.

개발자의 개발 환경을 고려하여 월~금 사이 AM 8:50 ~ PM 18:30 까지 만 사용 한다면 1일에 10시간만 사용함으로서 청구금액을 낮출 수 있다.

t3.medium ( 2 Core / 4G-RAM ) = 시간당 US$ 0.0416

0.0416 * 24 * 365 = $364

0.0416 * 10 * (365 / 7 * 5) = $108

* 예약 인스턴스 (Reserved instances) 를 사용한다면 더 낮출 수 있다.(30% ~ 63%) *

 

그래서 상시 떠있어야 하는 product 레벨의 서버 라든가 syslog 서버 등에서 아래와 같이 스크립트를 작성 하고 운영 하여 절감을 한다.


서버가 UTC 으로 세팅 되어 있는 서버 이기 때문에 cron 등록은 아래와 같이 진행하였다.

(cron : 50 23 * * 0-4 bash /shell/aws-start-instance.sh ) 월~금 KST AM 08:50 분에 작동

(cron : 30 09 * * * bash /shell/aws-start-instance.sh ) 매일 KST PM 18:30에 작동


인스턴스 자동 시작 스크립트 ( /shell/aws-start-instance.sh )


인스턴스 자동 정지 스크립트 ( /shell/aws-start-instance.sh )

 

AWS 의 EBS 스냅샷

현재는 EC2의 Lifecycle manager 의 등장으로 인해 오래된 snap-shot 의 삭제가 자동으로 이루어 지기 때문에 크게 필요가 없는 스크립트 이다.

물론 Lifecycle manager 에 비해 기능이 좀더 많다.

AWSCLI 를 사용하기 때문에 설치가 필요로 하다 ‘ㅅ’a

 

기능적으로는 아래와 같다.

1. AWS_REGION_ARR 에 선언된 리전을 타겟으로 한다.

2. RETENTION_LIMIT 에 지정된 일자(7개월) 만큼 매월 1일 데이터를 보관한다.

3. RETENTION_DAILY 에 지정된 일자(1개월) 만큼 매일 데이터를 보관한다.

4. BACKUP=ON 이 선언될 경우 작동중인 인스턴스의 모든 EBS 볼륨의 snap-shot을 생성한다.

5. SC_MODE=TEST 가 실제 작동이 아닌 어떤 작동을을 하게 될지 echo로 출력한다.