開発日報

IT・WEB系備忘。日報は嘘です。

【連載】AWSCDK for TypeScriptによるAWS環境構築入門 第2回 ~ ecs_patternsを使用してaws上でアプリを動作させる ~

はじめに

この連載ではAWSCDKを用いたaws環境構築の基本を学びます。

前回はawscdkの環境を構築しました。
今回はecs_patternsを使用して実際にaws環境を構築し、
Dockerで立てたアプリケーションfargate上で動作させてみましょう。

完成品のソースコードこちら

連載記事一覧

連載記事一覧

現在のモジュールの内容確認

実際に構築作業を行う前に前回作成したモジュールの内容を簡単に確認してみましょう。

まず、./cdk-test/bin/cdk-test.tsの中身をみてみましょう。

#!/usr/bin/env node
import 'source-map-support/register';
import cdk = require('@aws-cdk/core');
import { CdkTestStack } from '../lib/cdk-test-stack';

const app = new cdk.App();
new CdkTestStack(app, 'CdkTestStack');

「new CdkTestStack(app, 'CdkTestStack');」デプロイ可能な1単位としてのスタックの作成、

「import { CdkTestStack } from '../lib/cdk-test-stack';」で実際のスタック(aws環境)の定義ファイルの読み込みを行なっています。

リージョンとアカウントはスタックが保持しています。

次に、./cdk-test/lib/cdk-test-stack.tsを見てみましょう。

import cdk = require('@aws-cdk/core');

export class CdkTestStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

constructorの中身に実際のawsリソースの定義を書き込んでいきます。「// The code that defines your stack goes here」の部分です。

実際に構築してみる

前回 作成したモジュールのルートディレクトリがカレントディレクトリの前提です。

依存ライブラリのインストールと、「cdk synth」で現在の定義をもとにクラウドフォーメーションのテンプレートファイルを生成しています。

cd cdk-test
npm run build
cdk synth

今回はec2 ecs aws-ecs-patternsのライブラリを使用します。
aws-ecs-patternsとは、複数のawsリソースを含む一般的パターンを定義しているライブラリです。このクラスのコンストラクタに、必要なリソースのインスタンスを渡すだけで、一般的なパターンのインフラ環境を簡単に作成できる、非常に強力なライブラリです。

npm install @aws-cdk/aws-ec2 @aws-cdk/aws-ecs @aws-cdk/aws-ecs-patterns

では実際に実装してみましょう。./cdk-test/lib/cdk-test-stack.tsを以下のようにしてください

import cdk = require('@aws-cdk/core');
import ec2 = require("@aws-cdk/aws-ec2");
import ecs = require("@aws-cdk/aws-ecs");
import ecs_patterns = require("@aws-cdk/aws-ecs-patterns");

export class CdkTestStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const vpc = new ec2.Vpc(this, "CdkTestVpc", {
      maxAzs: 2
    });

    const cluster = new ecs.Cluster(this, "CdkTestCluster", {
      vpc: vpc,
      clusterName: 'CdkTestCluster',
    });

    const taskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDefinition');
    const container = taskDefinition.addContainer('CdkTestContainer', {
      image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'),
    });
    container.addPortMappings({
      containerPort: 80
    });

    new ecs_patterns.ApplicationLoadBalancedFargateService(this, "CdkTestFargateService", {
      cluster: cluster,
      cpu: 512,
      desiredCount: 1,
      memoryLimitMiB: 1024,
      taskDefinition: taskDefinition
    })

  }
}

意味は見ればなんとなくわかりますよね。 実装完了しましたら、再度ビルド・クラウドフォーメーションテンプレートの生成し、内容を確認してみましょう。

npm run build
cdk synth

デプロイ・動作確認

以下のコマンドでデプロイします。「cdk deploy 【スタック名】」です。

cdk deploy CdkTestStack

デプロイが完了しましたら、コンソールの最後に以下のような感じでロードバランサーのURLが表示されるので実際にアクセスしてみましょう。

Outputs:
CdkTestStack.CdkTestFargateServiceLoadBalancerDNSF3C686C2 = CdkTe-CdkTe-1KDL9CV8X6FXD-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
CdkTestStack.CdkTestFargateServiceServiceURLD7D78101 = http://CdkTe-CdkTe-1KDL9CV8X6FXD-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com

こんな感じの画面が出るはずです。

f:id:yuuu1993g:20191014022316p:plain

今回、以下のリソースが作成されているはずですので、実際にAWSのコンソール画面から確認してみると良いでしょう。

VPC
Public Subnet
Private Subnet
NAT Gateway
Route Table
Security Group
ELB
ECS Cluster
ECS Service
ECS Task Definition

削除は以下の感じで。

cdk destroy CdkTestStack

まとめ

今回はecs_patternsを使用してaws上でアプリを動作させました。 次回はcode piplineを作成しましょう。