AWS CDK를 사용하여 ECS(Fargate) 환경을 쉽게 구축하는 방법
ECS (Fargate) 환경을 수동으로 설정하려면 화면에서 보면 어느 정도 할 수 있지만,
ALB를 만들거나 Service, Task Definition 등을 설정하는 것은 복잡합니다.
또한 개념을 이해하는 데 시간이 걸립니다.
Dynamic Port Mapping을 사용하는 경우 Security Group에 inbound를 등록해야 하거나 시도 및 오류를 반복합니다.
구축만으로 피곤합니다.
따라서 AWS Cloud Template Kit (CDK)를 사용하면 20 줄 정도의 코드와 몇 번의 명령 실행으로
아래의 리소스와 함께 모범 사례인 ECS(Fargate) 환경을 구축해 주는 방법입니다.
네트워크
ECS (Fargate)
CDK의 install이나 초기 순서등은 이쪽으로 기재 있기 때문에 할애합니다.
htps : // 기주 b. 코 m / 아 ws ぁ bs / 아 ws-cdk # 껄껄 g-s r d
cdk init로 작성된 템플릿을 바탕으로 아래가 실제로 작성한 코드입니다.
Dockerhub를 사용하는 다른 예제가 있으므로 이번에는 ECR을 사용합니다.
lib/demo-stack.ts
import cdk = require('@aws-cdk/cdk');
import ecs = require("@aws-cdk/aws-ecs");
import ec2 = require("@aws-cdk/aws-ec2");
import ecr = require("@aws-cdk/aws-ecr");
export class DemoStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// ------------- ここを記載 --------------
// ベストプラクティスなネットワーク環境の構築
const vpc = new ec2.VpcNetwork(this, 'MyCdkVpc', {maxAZs: 2});
const cluster = new ecs.Cluster(this, 'Cluster', {vpc});
// ECSクラスタ設定(t2.medium指定)
cluster.addDefaultAutoScalingGroupCapacity({instanceType: new ec2.InstanceType("t2.medium"), instanceCount: 1});
// ECRを使用
const repository = new ecr.Repository(this, 'myRepoName');
// ECS(ALB/Service/Task Defintion/Container) 関連をまとめて構築
new ecs.LoadBalancedEc2Service(this, 'Service', {
cluster,
memoryLimitMiB: 512,
image: ecs.ContainerImage.fromEcrRepository(repository),
containerPort: 8080, // コンテナポート番号
environment: {
ENV: 'production'
}
});
// ------------- ここまで --------------
}
}
synth로 typescript 작성한 코드에서 CloudFormation Template(Yaml)에서 미리 확인할 수 있습니다.
CloudFormation의 400행 정도의 코드를 작성할 필요가 없어집니다.
$ cdk synth
$ cdk deploy
deploy는 IAM Policy 및 Security Group의 미리보기를 표시하고 AWS 계정에 빌드를 시작합니다.
ECR을 사용하는 경우는 리포지토리까지 작성해 줍니다만, 어플리케이션의 Docker Image 를 push 해 줄 필요가 있습니다.
따라서 생성된 리포지토리를 검색하고 이미지를 푸시합니다.
# リポジトリ名を取得
$ aws ecr describe-repositories | jq -r '.repositories[].repositoryName'
----
demos-demoa-xxxxxx
아래와 같은 명령(shell)을 실행하여 build&push 합니다.
build_push.sh
ECRID=xxxxxxxxx
ECRNAME=demos-demoa-xxxxxx
# build an your docker app
docker build -t ${ECRNAME} .
docker tag ${ECRNAME}:latest ${ECRID}.dkr.ecr.ap-northeast-1.amazonaws.com/${ECRNAME}:latest
# push
$(aws ecr get-login --no-include-email --region ap-northeast-1)
docker push ${ECRID}.dkr.ecr.ap-northeast-1.amazonaws.com/${ECRNAME}:latest
성공하면 ALB URL이 지불되므로 액세스하고 확인하고 결과가 반환되면 완료됩니다!
결과가 제대로 표시되지 않으면 Cluster Event 로그 및 Task를 AWS 콘솔, ecs-cli 등을 사용하여 다시 확인합니다.
ecs-cli ps --cluster DemoStack-Clusterxxxx-xxxxx
대개 컨테이너 포트가 올바르지 않거나 환경 변수, ECR 리포지토리에 등록되어 있는지 확인합니다.
삭제하려면 destory를 실행합니다. (사전에 ECR에 등록한 Image 삭제 필요)
$ cdk destory
CDK 단점으로서는 세세한 지정이나 조정하고 싶은 경우는, 별도로 각각 코드를 쓸 필요가 있을 것 같습니다.
예를 들어,
다음은 컨테이너에 log driver 등을 추가하는 경우입니다.
demo-stack.ts
const demoContainer = demoTaskDefinition.addContainer('demo-container', {
image: ecs.ContainerImage.fromEcrRepository(repository),
logging: new ecs.AwsLogDriver(this, 'demo-logging', { streamPrefix: 'demo-app' })
});
demoContainer.addUlimits(
{
name : ecs.UlimitName.Fsize,
hardLimit : 10240000,
softLimit : 10240000
}
)
세세한 인수의 지정이나 props 의 지정은 CDK doc 로 브라우저에서 문서를 열어서 검색・확인할 수 있습니다.
$ cdk docs
아직 미리 보기로 향후 개선 더욱 개선될 것 같지만, ECS(Fargate) 환경을 자주 만들어 테스트하고 삭제하는 경우에는 최적입니다.
CDK workshop도 있는 것 같아서, 한번 보고 시험해 보면 이미지가 솟아나갈까 생각합니다.
htps : // cd 쿠 rk 쇼 p. 코m/
Reference
이 문제에 관하여(AWS CDK를 사용하여 ECS(Fargate) 환경을 쉽게 구축하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ytanaka3/items/e755ff4551f01f76c303텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)