...
펼치기 | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||
|
펼치기 | ||
---|---|---|
| ||
2022-02-17 ~ 02-22(예정)
2020-06-01
2019-11-14
|
...
이 애플리케이션은 Seoul 리전에서 개발합니다. AWS 관리 콘솔 우측 하단에 Seoul 를 선택합니다. 화면에 표시되는 언어는 English 를 기본으로 진행합니다.
Elastic IP 생성
VPC의 NAT Gateway가 사용할 EIP를 생성합니다. AWS 관리콘솔에서 VPC 서비스로 이동한 후, Elastic IPs 메뉴를 선택하고, 상단의 Allocate new Elastic IP address 버튼을 클릭합니다.
다음 화면에서 IPfmf gkfekd qkedmf Group을 확인하고, Tags에 Key에는 Name 을 Value에는 ShortUrl 을 입력 후 Allocate 버튼을 클릭하면 고정 IP를 한 개 할당 받을 수 있습니다.
ㅊ
VPC 생성하기
부하 테스트를 위해서, Docker 이미지를 ECR에 올리고, Fargate를 통해 서버리스 형태로 배포하기 위해서 VPC와 Private subnet 이 필요합니다.
VPC 서비스의 Dashboard 화면에서 Launch VPC Wizard 버튼을 클릭하여 Public subnet과 Private subnet을 포함하고, NAT Gateway를 포함하는 VPC를 생성합니다.
AWS 관리콘솔에서 관리 콘솔에서 VPC 서비스로 이동한 후, VPC Dashboard 화면에서, Launch VPC Wizard 버튼을 클릭합니다.
VPC 설정 Step 1에서 2번째에 있는 VPC with Public and Private Subnets 을 선택 후, Select 버튼을 클릭합니다.
VPC 설정 Step 2에서 VPC name 에는 CDK-TEST 라는 ShortUrl 라는 이름을 입력하고, NAT Gateway 설정의 Elastic IP Allocation ID 는 위 단계에서 할당 받은 EIP를 클릭하고 하단의 Create VPC 버튼을 클릭합니다.
VPC 생성 작업이 진행되고, 아래와 같이 새로운 VPC가 생성됩니다. 해당 VPC ID 를 사용하므로 메모장에 복사 해 놓습니다.
AWS Cloud9 시작하기
...
AWS Cloud9의 Name 은 cdkenv 로 주고, 우측 하단의 Next step 버튼을 클릭합니다.
기본 설정 그대로 Next step 버튼을 클릭합니다.
Review에서 설정된 상태(EC2의 t2.micro 타입)를 확인하고 하단의 Create environment 버튼을 클릭합니다.
Cloud9 환경이 준비되는 것을 볼 수 있습니다. Cloud9이 가용해질 때까지 잠시 기다립니다. (약 1분 내외면 웹 상에서 개발을 할 수 있는 환경을 구축할 수 있습니다.)
AWS-CDK 설치
Cloud 9 최신 환경에는 AWS CDK가 설치되어 있습니다.
코드 블럭 | ||||
---|---|---|---|---|
| ||||
cdk --version |
만약 설치가 안되어 있다면 아래와 같이 설치하세요.
...
Cloud9 구동 화면
다음과 같이 구동이 되면, 하단의 Terminal 환경을 통해 아래와 같은 CLI 명령을 수행할 수 있습니다.
AWS-CDK 설치
Cloud 9 최신 환경에는 AWS CDK가 설치되어 있습니다. 아래 버전은 지속적으로 업데이트 되므로 보이는 것이 다를 수 있습니다.
코드 블럭 | ||||
---|---|---|---|---|
| ||||
title | npm을 이용한 aws-
프로젝트 시작
프로젝트 생성
프로젝트 디렉토리를 생성하고 이동합니다.
...
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
cdk init --language python |
CDK 개발 환경 확인
URL Short Demo 환경이 설치되었습니다. Cloud9의 좌측 폴더 구조를 확인합니다.
virtualenv 환경 진입
...
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
source .envvenv/bin/activate |
패키지 설정
setuprequirements.py txt 파일을 열어 데모에 필요한 패키지를 아래와 같이 추가하고 저장 합니다. 저장은 단축키 (2줄(cdk-watchful, boto3)을 추가하고 저장 합니다. 저장은 단축키 (Ctrl+S)로도 가능합니다.
코드 블럭 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
install_requires=[ "aws-cdk.core", "aws-cdk.aws-dynamodb", "aws-cdk.aws-events", "aws-cdk.aws-events-targets", "aws-cdk.aws-lambda", "aws-cdk.aws-s3", "aws-cdk.aws-ec2", "aws-cdk.aws-ecs-patterns", "aws-cdk.aws-apigateway", "aws-cdk.aws-cloudwatch", "cdk-watchful", "boto3" ],-lib==2.12.0 constructs>=10.0.0,<11.0.0 cdk-watchful boto3 |
패키지 설치
virtualenv 안에서 의존성에 맞추어 패키지를 설치합니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
python -m pip install -er requirements.txt |
CDK bootstrap
CDK Toolkit Stack을 만들기 위하여 bootstrap을 합니다. 123456789012 는 본인 AWS 계정 12자리 숫자로 대체하면 됩니다. AWS CDK로 클라우드 애플리케이션을 관리하는 데 필요한 리소스를 관리하는 S3 버킷도 생성합니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
cdk bootstrap aws://123456789012/ap-northeast-2 |
프로젝트 환경 설정
프로젝트 시작점인 app.py를 열어 봅니다. 직접 Cloud 9 UI의 네비게이션에 있는 파일을 직접 클릭 해서 열 수 있고, npm install -g c9 과 같이 패키지를 설치한 후에 c9 open app.py 와 같은 형태로 terminal에서도 바로 열 수 있습니다.
소스 코드 중에 UrlShortStack 클래스 정의로 커서를 이동하고, 함수 정의로 이동을 위해서 F3를 F3 키를 누릅니다.
새로운 탭에 url_short_stack.py 파일이 열립니다. 이제 이 스택에 리소스를 하나씩 만들어 나가겠습니다.
리소스 작성
DynamoDB 테이블 리소스 정의
아키텍처 다이어그램에 나와 있던 인프라를 하나씩 만들어 보겠습니다.
DynamoDB부터 만듭니다. CDK API Reference에 들어가면 다양한 리소스를 다룰 수 있는 것을 알 수 있습니다.
정보 |
---|
CDK API Reference - https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.htmlaws_cdk — AWS Cloud Development Kit 2.12.0 documentation (amazon.com) |
DynamoDB를 생성할 것이므로 아래 aws-dynamodb의 Overview를 들어갑니다.
https://docs.aws.amazon.com/cdk/api/latest/docs/aws-dynamodb-readme.html aws_cdk.aws_dynamodb — AWS Cloud Development Kit 2.12.0 documentation (amazon.com)
Python에서는 aws_cdk에 aws_dynamodb 패키지를 활용할 수 있는 것을 볼 수 있습니다.
...
url_short_stack.py 파일의 첫 줄을 아래와 같이 변경합니다. (, aws_dynamodb 문자 추가)
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
from aws_cdk import core, aws_dynamodb ( # Duration, Stack, aws_dynamodb as dynamodb, ) |
"# The code that defines your stack goes here" 주석 하단 에 DynamoDB 테이블 추가를 위해 아래에 코드를 추가합니다.
URL Short에서 생성되는 URL을 담아 둘 DynamoDB 테이블의 이름은 'mapping-table'이라 만들고 id에는 Short URL을 위한 코드를 UUID 값으로 넣을 겁니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
table = aws_dynamodb.Table(self, "mapping", partition_key = aws_dynamodb.Attribute(name="id",type=aws_dynamodb.AttributeType.STRING)) |
코드 작성이 완료 되면 아래와 같이 코드가 만들어졌을 것이고 만들어졌고 저장합니다.
CDK deploy로 DynamoDB 테이블 배포
...
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
cdk deploy |
Lambda 함수 코드 작성
Lambda 함수를 개발하기 위하여 폴더를 하나 생성합니다. UI에서 lambda라는 폴더를 만들고, 폴더 하단에 handler.py 파일을 생성합니다. (terminal에서 cmd로 만드셔도 됩니다.)
handler.py 파일은 Short URL을 생성하거나, Short URL이 들어올 경우 원래 URL로 Redirect 하는 기능을 제공하는 함수입니다.
다음과 같은 코드를 함수에 넣습니다. 코드를 한 번 읽어보면서 동작되는 원리를 살펴 봅니다.
...
Lambda 함수 코드를 만들었으니 Lambad 함수가 리소스로 배포되어야 합니다.
Lambda 함수를 만들기 위해서 AWS CDK를 참고하겠습니다. https://docs.aws.amazon.com/cdk/api/latest/docs/aws-lambda-readme.html
aws_cdk.aws_lambda — AWS Cloud Development Kit 2.12.0 documentation (amazon.com)
url_short_stack.py 파일에 aws_lambda를 사용하기 위해서 import에 추가합니다. (, aws_lambda 코드 추가추가, 이때 lambda_ 로 호출합니다.)
코드 블럭 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
from aws_cdk import core, aws_dynamodb, aws_lambda ( # Duration, Stack, aws_dynamodb as dynamodb, aws_lambda as lambda_ ) |
Lambda 함수를 선언합니다. Python은 lambda 키워드를 이미 가지고 있기 때문에 _를 추가하여 사용합니다Lambda 함수를 선언합니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
function = awslambda_lambda.Function(self, "backend", runtime=awslambda_lambda.Runtime.PYTHON_3_79, handler="handler.main", code=awslambda_lambda.Code.from_asset("./lambda")) |
Lambda 함수 리소스 배포
배포 Lambda 함수 확인
배포한 Lambda 함수 콘솔에 들어가서 확인이 가능합니다.
Lambda 함수에 DynamoDB Table로의 접근 권한 부여
...
다음과 같은 형태의 코드가 작성이 완료되었습니다.
CDK diff 기능
새로운 CDK 명령인 diff 기능입니다. 리소스에 대한 변경 사항을 확인할 수 있습니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
cdk diff |
IAM 설정이 변경된 것을 볼 수 있으며, DDB mapping에 대한 Lambda 함수에 정책이 추가된 것을 볼 수 있습니다. backend라는 Lambda 함수가 이 정책을 쓰는 주체가 되는 것을 알 수 있습니다.
Lambda 함수가 수정된 것을 볼 수 있으며, 환경 변수 값이 추가되었고 새롭게 만들어진 정책이 적용된 것을 볼 수 있습니다.
...
cdk를 deploy 하면 아래와 같이 변경 사항을 적용할지를 적용할지 물어보고, y를 선택하면 배포 되는 것을 확인할 수 있습니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
cdk deploy |
API Gateway 리소스 정의
이번에는 API를 연결하기 위해서 API Gateway를 추가 하겠습니다.
먼저 API Gateway를 Import 해야 합니다. 사용 방법은 CDK API 레퍼런스를 참조합니다.
https://docs.aws.amazon.com/cdk/api/latest/docs/aws-apigateway-readme.htmlaws_cdk.aws_apigateway — AWS Cloud Development Kit 2.12.0 documentation (amazon.com)
해당 패키지를 추가합니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
from aws_cdk import core, ( # Duration, Stack, aws_dynamodb as dynamodb, aws_lambda as lambda_, aws_apigateway as apigateway ) |
API Gateway를 선언하겠습니다.
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
api = aws_apigateway.LambdaRestApi(self, "api", handler=function) |
전체 소스 코드는 다음과 같습니다.
API Gateway 리소스 배포
...
다음과 같이 API가 배포되는 것을 볼 수 있습니다. Endpoint URL이 생성됩니다.
테스트
배포된 API Endpoint URL이 정상 동작이 되는지 확인해 봅시다.
배포가 완료되면 Outputs에 나와 있는 배포된 URL을 복사해서 웹 브라우저 주소창에 넣고 확인합니다. (본인의 프로젝트에서 생성된 URL을 이용하여 테스트 하세요.)
https://vp8tpwdmd4pqy4zo7jd9.execute-api.ap-northeast-2.amazonaws.com/prod/
호출에 대한 정당한 200 OK 메시지를 받는 것을 알 수 있습니다. 사용 방법에 맞춰서 한 번 호출해 봅시다.
...
아마존닷컴에 접속할 수 있는 URL을 만들어 보겠습니다. (본인의 프로젝트에서 생성된 URL을 이용하여 테스트 하세요.)
https://vp8tpwdmd4pqy4zo7jd9.execute-api.ap-northeast-2.amazonaws.com/prod/?targetUrl=https://www.amazon.com
생성된 URL을 입력할 경우, 정상적으로 Redirect 되는지 확인해 봅시다. (본인의 프로젝트에서 생성된 URL을 이용하여 테스트 하세요.)
https://vp8tpwdmd4pqy4zo7jd9.execute-api.ap-northeast-2.amazonaws.com/prod/7c9b02b8de32adf6
잘 동작하는 것을 볼 수 있습니다.
...
경고 |
---|
작업 진행중 (2022-02-17) 아래는 수정 이전이므로 동작을 보장하지 않습니다. |
미션 2. 부하 테스트 및 모니터링 대시보드 작성
...