...
펼치기 | ||
---|---|---|
| ||
2019-09-25
|
문서 URL: https://cdk.awsdemokrawsdemo.comkr/devops301lab2
미션 1. CDK 서비스를 이용한 짧은 URL 생성 애플리케이션 구축하기
...
해당 앱의 결과물은 다음과 같은 링크를 가지는 것입니다. 여기서는 API를 위한 Custom domain name(cdk.awsdemokrawsdemo.com처럼kr처럼)을 설정하는 방법이 있지만, Route 53에 Domain이 등록되어 있지 않는 것을 가정하고 진행합니다. 미션2는 생략할 수 있습니다.
Demo 테스트 방법: https://cdk.awsdemokrawsdemo.comkr?targetUrl=https://www.amazon.com 과 같이 URL을 호출하면 짧은 URL을 반환해 주는 App입니다. 아래와 같은 결과물이 화면에 출력됩니다.
코드 블럭 | ||
---|---|---|
| ||
Created URL: https://cdk.awsdemokrawsdemo.comkr/b44086fd |
해당 데모는 bit.ly 사이트처럼 Front-end 페이지를 구축하지는 않습니다.(CDK를 이용하여 Back-end를 구축하는 방법에 집중합니다.)
...
코드 블럭 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
import os from aws_cdk.core import Stack, Construct, Environment from aws_cdk import aws_apigateway, aws_route53, aws_route53_targets, aws_certificatemanager, aws_ec2 # we need default values here since aws-cdk-examples build synthesizes the app ACCOUNT=os.environ.get('WALTERSCO_ACCOUNT', '123456789012') REGION=os.environ.get('WALTERSCO_REGION', 'ap-northeast-1') VPC_ID = os.environ.get('WALTERSCO_VPC_ID', 'vpc-0e680e107cb16f0c9') ZONE_NAME = os.environ.get('WALTERSCO_ZONE_NAME', 'awsdemokrawsdemo.comkr') ZONE_ID = os.environ.get('WALTERSCO_ZONE_ID', 'Z2B54ZGB38V31I') ZONE_CERT = os.environ.get('WALTERSCO_ZONE_CERT', 'arn:aws:acm:ap-northeast-1:123456789012:certificate/ea3bef71-7d73-4979-bc3d-165931ceb141') AWS_ENV = Environment(account=ACCOUNT, region=REGION) class WaltersCoStack(Stack): """ A base CDK stack class for all stacks defined in our fun little company. """ def __init__(self, scope: Construct, id: str, **kwargs): super().__init__(scope, id, env=AWS_ENV, **kwargs) # lookup our pre-created VPC by ID self._vpc = aws_ec2.Vpc.from_lookup(self, "vpc", vpc_id=VPC_ID) @property def waltersco_vpc(self) -> aws_ec2.IVpc: """ :return: The walters co. vpc """ return self._vpc def map_waltersco_subdomain(self, subdomain: str, api: aws_apigateway.RestApi) -> str: """ Maps a sub-domain of waltersco.co to an API gateway :param subdomain: The sub-domain (e.g. "www") :param api: The API gateway endpoint :return: The base url (e.g. "https://www.waltersco.co") """ domain_name = subdomain + '.' + ZONE_NAME url = 'https://' + domain_name cert = aws_certificatemanager.Certificate.from_certificate_arn(self, 'DomainCertificate', ZONE_CERT) hosted_zone = aws_route53.HostedZone.from_hosted_zone_attributes(self, 'HostedZone', hosted_zone_id=ZONE_ID, zone_name=ZONE_NAME) # add the domain name to the api and the A record to our hosted zone domain = api.add_domain_name('Domain', certificate=cert, domain_name=domain_name) aws_route53.ARecord( self, 'UrlShortenerDomain', record_name=subdomain, zone=hosted_zone, target=aws_route53.RecordTarget.from_alias(aws_route53_targets.ApiGatewayDomain(domain))) return url __all__ = ["WaltersCoStack"] |
...
도메인 배포까지 시간이 소요될 수 있습니다. (30분 내외)
https://cdk.awsdemokrawsdemo.comkr/715a930b
미션 3. 부하 테스트 및 모니터링 대쉬보드 작성
...
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
URL=https://cdk.awsdemokrawsdemo.comkr/715a930b ./ping.sh |
테스트를 하면 아래와 같이 1초마다 갱신되는 화면을 URL 정보가 리다이렉트 되는 것을 볼 수 있습니다.
...
코드 블럭 | ||||||
---|---|---|---|---|---|---|
| ||||||
docker run -it -e URL=https://cdk.awsdemokrawsdemo.comkr/715a930b pinger |
CDK를 이용한 Fargate 배포 설정
...
코드 블럭 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
from aws_cdk import core, aws_dynamodb, aws_lambda, aws_apigateway from waltersco_common import WaltersCoStack from traffico import Traffico class UrlShrotenerStack(WaltersCoStack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # The code that defines your stack goes here table = aws_dynamodb.Table(self, "mapping-table", partition_key = aws_dynamodb.Attribute(name="id",type=aws_dynamodb.AttributeType.STRING)) function = aws_lambda.Function(self, "backend", runtime=aws_lambda.Runtime.PYTHON_3_7, handler="handler.main", code=aws_lambda.Code.asset("./lambda")) table.grant_read_write_data(function) function.add_environment("TABLE_NAME", table.table_name) api = aws_apigateway.LambdaRestApi(self, "api", handler=function) self.map_waltersco_subdomain("cdk", api) class TrafficStack(WaltersCoStack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) Traffico(self, 'TestTraffic', vpc= self.waltersco_vpc, url='https://cdk.awsdemokrawsdemo.comkr/715a930b', tps=10) |
app.py 파일을 수정합니다.
...
코드 블럭 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
from aws_cdk import core, aws_dynamodb, aws_lambda, aws_apigateway from waltersco_common import WaltersCoStack from traffico import Traffico from cdk_watchful import Watchful class UrlShrotenerStack(WaltersCoStack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # The code that defines your stack goes here table = aws_dynamodb.Table(self, "mapping-table", partition_key = aws_dynamodb.Attribute(name="id",type=aws_dynamodb.AttributeType.STRING)) function = aws_lambda.Function(self, "backend", runtime=aws_lambda.Runtime.PYTHON_3_7, handler="handler.main", code=aws_lambda.Code.asset("./lambda")) table.grant_read_write_data(function) function.add_environment("TABLE_NAME", table.table_name) api = aws_apigateway.LambdaRestApi(self, "api", handler=function) self.map_waltersco_subdomain("cdk", api) wf = Watchful(self, 'monitoring', alarm_email='meelong0@studydev.com') wf.watch_scope(self) class TrafficStack(WaltersCoStack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) Traffico(self, 'TestTraffic', vpc= self.waltersco_vpc, url='https://cdk.awsdemokrawsdemo.comkr/715a930b', tps=10) |
cdk-watchful 배포
...