はじめに
AWS CDK(Python)を使ってAWS Fargate Serviceを構築してみたいと思います。
今回作成したコードはこちら
↑このコードで下記構成を作成します。
構成図
準備
- AWSアカウント
- CDK用IAM User
フロー
cdk install
$ npm install -g aws-cdk
cdk
が実行できない場合は、PATHが通っているか確認する。
$ which node
/path/to/bin/node
$ export
...
PATH=/path/to/hoge:/path/to/fuga
...
$ export PATH=$PATH:/path/to/current/bin
$ export
...
PATH=/path/to/hoge:/path/to/fuga:/path/to/current/bin
...
環境変数設定
export AWS_ACCESS_KEY_ID=hoge
export AWS_SECRET_ACCESS_KEY=fuga
export ROLE_ARN=arn:aws:iam::xxxxxxxxxxxx:role/ecsTaskExecutionRole
export ECR_REGISOTRY=xxxxxxxxxxxx:role.dkr.ecr.ap-northeast-1.amazonaws.com/django-app:latest
cdk init
$ mkdir /path/to/cdk_fargate
$ cd /path/to/cdk_fargate
$ cdk init --language python
実装
$ pwd
/path/to/cdk_fargate
$ cd cdk_fargate/
vi cdk_fargate_stack.py
cdk_fargate_stack.py
はこちら
VPC作成
- Availability Zoneを2つ指定してVPC作成。
ECS Cluster作成
- 作成したVPCを指定してECS Clusterを作成。
Fargate Service作成
- ecs_pattern.ApplicationLoadBalancedFargateServiceを使って、Fargate Serviceを構築。
- 今回は、Nginxのイメージを参照。
Output
- ALBのDNSをOutputする
import os
from dotenv import load_dotenv
from aws_cdk import (
aws_ec2 as ec2,
aws_ecs as ecs,
aws_iam as iam,
aws_ecs_patterns as ecs_patterns,
core,
)
load_dotenv()
ROLE_ARN = os.environ["ROLE_ARN"]
ECR_REGISOTRY = os.environ["ECR_REGISOTRY"]
class CdkFargateStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
vpc = ec2.Vpc(self, "CdkFargateVpc", max_azs=2)
cluster = ecs.Cluster(self, "Ec2Cluster", vpc=vpc)
role = iam.Role.from_role_arn(self, "Role", ROLE_ARN)
image = ecs.ContainerImage.from_registry(ECR_REGISOTRY)
task_definition = ecs.FargateTaskDefinition(
scope=self, id="TaskDefinition", execution_role=role, task_role=role
)
port_mapping = ecs.PortMapping(container_port=80, host_port=80)
container = task_definition.add_container(
id="Container", image=image
).add_port_mappings(port_mapping)
fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(
self, "FargateService", cluster=cluster, task_definition=task_definition
)
core.CfnOutput(
self,
"LoadBalancerDNS",
value=fargate_service.load_balancer.load_balancer_dns_name,
)
cdk deploy
$ export AWS_ACCESS_KEY_ID=hoge
$ export AWS_SECRET_ACCESS_KEY=fuga
$ cdk deploy
動作確認
$ curl cdk-f-farga-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com
cdk destroy
$ cdk destory
リソースがすべて削除されている!
次やりたいこと
- ECRを使ったイメージ管理
- ACM, Route53をつかったカスタムドメイン対応
まとめ
チームではPythonを使って開発していますが、共通言語を使って構成管理ができることは素晴らしいと感じました。
CDKを使った構成管理をどんどん推し進めていきたいです。
カスタムドメイン設定まで実装できなかったので