AWS CDKを使用してAmazon ECS の開始方法 - Amazon Elastic Container Service

AWS CDKを使用してAmazon ECS の開始方法

このチュートリアルでは、FargateのAmazon Elastic Container Service とFargateのAWS Cloud Development Kit (CDK)で、コンテナ化されたWebサーバーをデプロイする方法を紹介します。AWS CDKは、本格的なプログラミング言語を使用して、AWSインフラストラクチャを定義することができるコードとしてのインフラストラクチャ (IAC) フレームワークです。CDK でサポートされている言語の 1 つでアプリケーションを書き、1 つ以上のスタックを含み、それをAWS CloudFormationテンプレートに合成し、リソースをAWSアカウントにデプロイします。

CDKに含まれるAWS構成ライブラリは、すべてのAWSサービスに提供されるリソースをモデル化するAPIを提供しています。最も一般的なサービスでは、スマートなデフォルトを提供し、必要なパラメータを減らしてベストプラクティスを実装できるよう、ライブラリは厳選された構成を提供します。これらのモジュールの1つ、aws-ecs-patternsは、コンテナ化されたサービスと必要なすべてのサポートリソースを、ほんの数行のコードで定義できるように、高レベルの抽象化を提供します。

このチュートリアルで使用する構成はApplicationLoadBalancedFargateServiceです。名前からわかるように、この構成は、アプリケーションロードバランサーの背後にある Fargate に Amazon ECS サービスをデプロイします。またaws-ecs-patternsモジュールには、ネットワークロードバランサーを使用するコンストラクトと/または希望の場合は、Amazon EC2 で実行するコンストラクトも含まれています。

このチュートリアルを開始する前に、AWS CDK-前提条件で開始方法での説明にあるように、AWS CDK開発環境 を設定し、それから発行してAWS CDKをインストール:

npm install -g aws-cdk

ステップ 1:AWS CDK プロジェクトを設定する

新しいAWS CDKアプリケーションのディレクトリを作成し、プロジェクトを初期化します。

TypeScript
mkdir hello-ecs cd hello-ecs cdk init --language typescript
JavaScript
mkdir hello-ecs cd hello-ecs cdk init --language javascript
Python
mkdir hello-ecs cd hello-ecs cdk init --language python

プロジェクトが初期化されたら、プロジェクトの仮想環境をアクティブにし、AWS CDKのベースラインの依存関係をインストールします。

source .venv/bin/activate python -m pip install -r requirements.txt
Java
mkdir hello-ecs cd hello-ecs cdk init --language java

このMavenプロジェクトをJava IDEにインポートします(例えば、Eclipseではファイル >インポート >Maven >既存の Maven プロジェクト).

C#
mkdir hello-ecs cd hello-ecs cdk init --language csharp
注記

必ずディレクトリの名前はhello-ecs図のようにしてください。AWS CDKアプリケーションテンプレートは、プロジェクトディレクトリの名前を使用し、ソースファイルとクラスの名前を生成します。別の名前を使用する場合は、アプリはこのチュートリアルと一致しません。

今すぐaws-ecs-patternsをインストールしてライブラリモジュールを構築します。

TypeScript
npm install @aws-cdk/aws-ecs-patterns
JavaScript
npm install @aws-cdk/aws-ecs-patterns
Python
python -m pip install aws-cdk.aws-ecs-patterns
Java

プロジェクトのpom.xmlを編集し、既存の <dependencies>コンテナ 内に、以下の依存関係を追加します。

<dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>ecs</artifactId> <version>${cdk.version}</version> </dependency> <dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>ecs-patterns</artifactId> <version>${cdk.version}</version> </dependency>

Mavenは、次回アプリケーションを構築するときに、これらの依存関係を自動的にインストールします。構築するには、mvn compileを使用するか、Java IDEの構築するコマンドを使用します。

C#
dotnet add src\HelloEcs package Amazon.CDK.AWS.ECS.Patterns

また、Visual Studio NuGet GUIを使用して、示されたパッケージをインストールすることもできます。ツール >NuGet パッケージマネージャー >ソリューションの NuGet パッケージの管理の手順で可能です。

aws-ecs-patternsモジュールをインストールすると、aws-ecs-patternsの依存関係のため、aws-ecsモジュールもインストールされます。対応するパッケージをインポートすることで、これらのモジュールはAWS CDKアプリケーションケーションで使用できます。

TypeScript
@aws-cdk/aws-ecs @aws-cdk/aws-ecs-patterns
JavaScript
@aws-cdk/aws-ecs @aws-cdk/aws-ecs-patterns
Python
aws_cdk.aws_ecs aws_cdk.aws_ecs_patterns
Java
software.amazon.awscdk.services.ecs software.amazon.awscdk.services.ecs.patterns
C#
Amazon.CDK.AWS.ECS Amazon.CDK.AWS.ECS.Patterns

ステップ 2:AWS CDKを使用して、Fargate 上のコンテナ化されたWebサーバーを定義します

Docker Hub から コンテナイメージ amazon-ecs-sample をプルするします。このイメージには、Amazon Linux 2 で実行されている PHP ウェブアプリケーションが含まれています。

作成したAWS CDKプロジェクトで、スタックの定義を含むファイルを編集して、以下のコードのようにします。ApplicationLoadBalancedFargateServiceコンストラクトのインスタンス化―または少なくともその名前を認識できます。

注記

スタックとは何でしょう? スタックはデプロイの単位です:すべてのリソースがスタック内にある必要があり、スタック内のすべてのリソースが一緒にデプロイされます。リソースのデプロイに失敗すると、すでにデプロイされている他のリソースはロールバックされます。AnAWS CDKアプリケーションには複数のスタックを含めることができ、1 つのスタック内のリソースは別のスタック内のリソースを参照することができます。

TypeScript

以下のようにlib/hello-ecs-stack.tsを更新します。

import * as cdk from '@aws-cdk/core'; import * as ecs from '@aws-cdk/aws-ecs'; import * as ecsp from '@aws-cdk/aws-ecs-patterns'; export class HelloEcsStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new ecsp.ApplicationLoadBalancedFargateService(this, 'MyWebServer', { taskImageOptions: { image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'), }, publicLoadBalancer: true }); } }
JavaScript

以下のようにlib/hello-ecs-stack.jsを更新します。

const cdk = require('@aws-cdk/core'); const ecs = require('@aws-cdk/aws-ecs'); const ecsp = require('@aws-cdk/aws-ecs-patterns'); class HelloEcsStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new ecsp.ApplicationLoadBalancedFargateService(this, 'MyWebServer', { taskImageOptions: { image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'), }, publicLoadBalancer: true }); } } module.exports = { HelloEcsStack }
Python

以下のようにhello-ecs/hello_ecs_stack.pyを更新します。

from aws_cdk import core as cdk import aws_cdk.aws_ecs as ecs import aws_cdk.aws_ecs_patterns as ecsp class HelloEcsStack(cdk.Stack): def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) ecsp.ApplicationLoadBalancedFargateService(self, "MyWebServer", task_image_options=ecsp.ApplicationLoadBalancedTaskImageOptions( image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")), public_load_balancer=True )
Java

以下のようにsrc/main/java/com.myorg/HelloEcsStack.javaを更新します。

package com.myorg; import software.amazon.awscdk.core.Construct; import software.amazon.awscdk.core.Stack; import software.amazon.awscdk.core.StackProps; import software.amazon.awscdk.services.ecs.ContainerImage; import software.amazon.awscdk.services.ecs.patterns.ApplicationLoadBalancedFargateService; import software.amazon.awscdk.services.ecs.patterns.ApplicationLoadBalancedTaskImageOptions; public class HelloEcsStack extends Stack { public HelloEcsStack(final Construct scope, final String id) { this(scope, id, null); } public HelloEcsStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); ApplicationLoadBalancedFargateService.Builder.create(this, "MyWebServer") .taskImageOptions(ApplicationLoadBalancedTaskImageOptions.builder() .image(ContainerImage.fromRegistry("amazon/amazon-ecs-sample")) .build()) .publicLoadBalancer(true) .build(); } }
C#

以下のようにsrc/HelloEcs/HelloEcsStack.csを更新します。

using Amazon.CDK; using Amazon.CDK.AWS.ECS; using Amazon.CDK.AWS.ECS.Patterns; namespace HelloEcs { public class HelloEcsStack : Stack { internal HelloEcsStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { new ApplicationLoadBalancedFargateService(this, "MyWebServer", new ApplicationLoadBalancedFargateServiceProps { TaskImageOptions = new ApplicationLoadBalancedTaskImageOptions { Image = ContainerImage.FromRegistry("amazon/amazon-ecs-sample") }, PublicLoadBalancer = true }); } } }

この短いスニペットで見ることができます:

  • サービスの論理名、MyWebServer

  • DockerHub から取得したコンテナーイメージ、amazon/amazon-ecs-sample..

  • ロードバランサーが公開アドレスを持ち、インターネットからアクセスできるということ。

ここですでに説明したので省略していますが、Amazon ECS クラスター、基盤となる Amazon Virtual Private Cloud と Amazon EC2 インスタンス、Auto Scaling グループ、Application Load Balancer、必要な IAM ロールとポリシー、その他のAWSリソースを Web サーバーのデプロイに必要な場合、AWS CDKは、これらのリソースも作成します。自動プロビジョニングされたリソースの一部は、スタックで定義されているすべての Amazon ECS サービスにより共有されます。

ソースファイルを保存し、cdk synthアプリのメインディレクトリで発行します。AWS CDKでアプリケーションを実行し、そのアプリケーションからAWS CloudFormationテンプレートを合成し、テンプレートを表示します。テンプレートは約600行のYAMLなので、ここでは冒頭のみを示します。(テンプレートは当社と異なる場合があります)。

Resources: MyWebServerLB3B5FD3AB: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: LoadBalancerAttributes: - Key: deletion_protection.enabled Value: "false" Scheme: internet-facing SecurityGroups: - Fn::GetAtt: - MyWebServerLBSecurityGroup01B285AA - GroupId Subnets: - Ref: EcsDefaultClusterMnL3mNNYNVpcPublicSubnet1Subnet3C273B99 - Ref: EcsDefaultClusterMnL3mNNYNVpcPublicSubnet2Subnet95FF715A Type: application DependsOn: - EcsDefaultClusterMnL3mNNYNVpcPublicSubnet1DefaultRouteFF4E2178 - EcsDefaultClusterMnL3mNNYNVpcPublicSubnet2DefaultRouteB1375520 Metadata: aws:cdk:path: HelloEcsStack/MyWebServer/LB/Resource MyWebServerLBSecurityGroup01B285AA: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Automatically created Security Group for ELB HelloEcsStackMyWebServerLB06757F57 SecurityGroupIngress: - CidrIp: 0.0.0.0/0 Description: Allow from anyone on port 80 FromPort: 80 IpProtocol: tcp ToPort: 80 VpcId: Ref: EcsDefaultClusterMnL3mNNYNVpc7788A521 Metadata: aws:cdk:path: HelloEcsStack/MyWebServer/LB/SecurityGroup/Resource # and so on for another few hundred lines

AWSアカウントでサービスをデプロイするには、cdk deployを発行します。AWS CDKが生成されたIAM ポリシーを承認するよう求められます。

デプロイには数分かかります。AWS CDKが、かなりの数の リソースを作成するのが確認できます。デプロイからの出力の最後の数行に、ロードバランサーの公開ホスト名と、新しい Web サーバーの HTTP URL が含まれます。

Outputs: HelloEcsStack.MyWebServerLoadBalancerDNSXXXXXXX = Hello-MyWeb-ZZZZZZZZZZZZZ-ZZZZZZZZZZ.us-west-2.elb.amazonaws.com HelloEcsStack.MyWebServerServiceURLYYYYYYYY = http://Hello-MyWeb-ZZZZZZZZZZZZZ-ZZZZZZZZZZ.us-west-2.elb.amazonaws.com

ステップ 3: ウェブサーバーをテストする

デプロイ出力から URL をコピーし、Web ブラウザに貼り付けます。Web サーバーからのウェルカムメッセージが表示が確認できます。

ステップ 4: クリーンアップする

これで、Web サーバーの使用が完了しました ([おめでとう] メッセージを表示する以外に何もしません)。AWS CDKを使用して、サービスを破壊することができます。問題cdk destroyをアプリケーションのメインディレクトリでを発行します。これを行うことで、意図AWSしない課金を防ぐことができます。

次のステップ

AWS CDKを使用してAWSインフラストラクチャの開発の詳細については、AWS CDK デベロッパーガイドを参照してください。

お好みの言語でAWS CDKアプリケーションを書く方法についての情報は、以下を参照してください:

TypeScript

TypeScript でAWS CDKを操作

JavaScript

JavaScript でAWS CDKを操作 

Python

Python でAWS CDKを捜査 

Java

Java でAWS CDKを操作

C#

C# でAWS CDKを操作

このチュートリアルで使用するAWSライブラリモジュールの構築についての詳細は、以下に示すAWS CDKAPI リファレンスの概要を参照してください。