Amazon Web Services ブログ

AWS クラウド開発キット (CDK) – TypeScript と Python 用がご利用可能に

Infrastructure as Code を管理することで享受できるメリットは数多くあります。そのため、DevOps のプラクティスをうまく適用するきっかけとなることがよくあります。Infrastructure as Code によって、手動での実行手順に頼る代わりに、管理者と開発者の両方が構成ファイルを使用し、アプリケーションに必要なコンピューティング、ストレージ、ネットワーク、アプリケーションサービスのプロビジョニングを自動化できるようになります。

たとえば、Infrastructure as Code を定義すると、次のことが可能です。

  • インフラストラクチャとアプリケーションコードを同じリポジトリに保管する
  • さまざまな環境、AWS アカウント、AWS リージョンにわたって実行されるインフラストラクチャの変更を再現かつ予測できるようにする
  • 継続的なテストができるように、ステージング環境で本番環境を再現する
  • ストレステストの実行に必要な時間だけ使用するパフォーマンステスト環境で、本番環境を再現する
  • デプロイにインフラストラクチャの更新が含まれるように、コードの変更と同じツールを使用してインフラストラクチャの変更をリリースする
  • コードレビューや小さな変更を頻繁にデプロイするなどのインフラストラクチャ管理に、ソフトウェア開発のベストプラクティスを適用する

インフラストラクチャの管理に使用する設定ファイルは、従来的には YAML または JSON テキストファイルとして実装されていますが、この方法だと最新のプログラミング言語が持つ利点のほとんどを見逃してしまっています。特に YAML では、別のシステムへの転送中に切り捨てられたファイルを検出したり、あるテンプレートから別のテンプレートにコピーして貼り付けた際に行が欠落したことを検出するのは極めて困難です。

お好みのプログラミング言語が持つ表現力を大いに活用し、クラウドインフラストラクチャを定義できればいいと思いませんか? こうした考えから、昨年の開発者向けプレビューで、AWS クラウド開発キット (CDK) を発表しました。これは、使い慣れたプログラミング言語を使ってクラウドインフラストラクチャをモデル化およびプロビジョニングするための拡張可能なオープンソースソフトウェア開発フレームワークです。

そして本日、TypeScript および Python 用の AWS CDK の一般利用を開始することができました。

AWS CDK を使用すると、固有の要件を組み込んだ独自のカスタムコンポーネントを設計、構成、共有できます。たとえば、独自の標準 VPC を設定するコンポーネントや、それに関連付いたルーティングとセキュリティ設定を作成できます。あるいは、AWS CodeBuildCodePipeline のようなツールを使用したマイクロサービス用の標準的な CI/CD パイプラインも作成可能です。

個人的に気に入っている点は、AWS CDK では同じプログラミング言語を使用し、さらに最新の IDE に組み込まれているオートコンプリートやパラメータサジェスチョンといったサポートを利用することで、インフラストラクチャを含むアプリケーションを IDE で構築できることです。これで、1 つのツールやテクノロジー、その他のツールとの間でわざわざ頭を切り替える必要がなくなります。 AWS CDK を使用すると、AWS インフラストラクチャをすばやくコーディングして構成し、アプリケーションコードと連携させることが楽しくなります。

AWS CDK のしくみ
AWS CDK 内のすべてがコンストラクトで成り立っています。コンストラクトとは、S3 バケットや SNS トピックなどの単一リソース、静的ウェブサイト、あるいは複数の AWS アカウントとリージョンにまたがる複雑なマルチスタックアプリケーションなどの、複雑なアーキテクチャを表現できるクラウドコンポーネントと考えることができます。コンストラクトは他のコンストラクトを含むことが可能なため、再利用を行いやすくなります。 コンストラクトをまとめてスタックにして、AWS 環境や、1 つ以上のスタックのコレクションである appsにデプロイできます。

AWS CDK の使用方法
お客様からのフィードバックに基づいて、どんどん新機能を追加しています。つまり、AWS リソースを作成するとき、多くの場合では、オプションと依存関係を多数指定する必要があります。たとえば VPC を作成する場合、使用するアベイラビリティゾーン (AZ) の数や、VPC にデプロイするリソースへのプライベートアクセスとパブリックアクセスを許可するサブネットの構成方法を検討する必要があります。

AWS リソースの状態を簡単に定義できるようにするために、AWS Construct ライブラリ では必要に応じて、カスタマイズできる実用的なデフォルトを使って、数多くの AWS のサービスが持つ多彩な機能を公開しています。上記の場合で指定のない場合、VPC コンストラクトは 3 つの AZ を使用して、VPC にあるあらゆる AZ 用のパブリックサブネットとプライベートサブネットをデフォルトで作成します。

CDK アプリケーションの作成と管理には、Node.js を必要とするコマンドラインツールの AWS CDK コマンドラインインターフェイス (CLI) を使い、次のコマンドですばやくインストールできます。

npm install -g aws-cdk

この後には、さまざまなコマンドで CDK CLI を使用できます。

  • cdk init は、サポートされているプログラミング言語のいずれかを使って、現在のディレクトリで新しい CDK プロジェクトを初期化するのに使用します。
  • cdk synth は、このアプリケーションの CloudFormation テンプレートを印刷します。
  • cdk deploy は、AWS アカウントにアプリケーションをデプロイします。
  • cdk diff は、プロジェクトファイルの内容とデプロイされた内容を比較するのに使用します。

利用可能なコマンドやオプションの詳細を確認するには、cdk を実行するだけです。

たとえば JenkinsAWS CodeBuild を使用すると、簡単に CDK CLI をデプロイ自動化ワークフローに含めることが可能です。

AWS CDK を使って、2 つのサンプルプロジェクトをいろんなプログラミング言語で作成してみましょう。

TypeScript の例
最初のプロジェクトでは、TypeScript を使ってインフラストラクチャを定義します。

cdk init app --language=typescript

これは、VPC のパブリック/プライベートサブネットの詳細を入力せずに、これから作成するものを簡単に示しています。キューにメッセージを書き込むオンラインフロントエンドと、キューからメッセージを消費する非同期バックエンドがあります。

スタック内では、必要なリソースとそれらのリソース関係を次の TypeScript コードが定義しています。

  • まず、その VPC で VPC と Amazon ECS クラスターを定義します。AWS Construct ライブラリが提供するデフォルトを使用すれば、ここではパラメータを指定する必要はありません。
  • 次に、Amazon SQS キューと AWS Fargate で実行している ECS サービスを数行のコードでセットアップできる ECS パターンを使って、そのキューのメッセージを消費します。
  • ECS パターンライブラリでは、負荷分散サービス、キュー処理、スケジュール済みタスクなどの一般的なアーキテクチャパターンに従う、より高レベルの ECS コンストラクトを提供しています。
  • Lambda 関数は ECS パターンが作成したキューの名前を持ち、環境変数として渡され、メッセージをキューに送信するためのアクセス許可が付与されています。
  • Lambda 関数のコードと Docker イメージは assets として渡されます。アセットを使用すると、プロジェクトのファイルまたはディレクトリをまとめたり、それらを Lambda や ECS で使用したりできるようになります。
  • そして Amazon API Gateway エンドポイントは、この機能に HTTPS REST インターフェイスを追加します。
const myVpc = new ec2.Vpc(this, "MyVPC");

const myCluster = new ecs.Cluster(this, "MyCluster", {
  vpc: myVpc
});

const myQueueProcessingService = new ecs_patterns.QueueProcessingFargateService(
  this, "MyQueueProcessingService", {
    cluster: myCluster,
    memoryLimitMiB: 512,
    image: ecs.ContainerImage.fromAsset("my-queue-consumer")
  });

const myFunction = new lambda.Function(
  this, "MyFrontendFunction", {
    runtime: lambda.Runtime.NODEJS_10_X,
    timeout: Duration.seconds(3),
    handler: "index.handler",
    code: lambda.Code.asset("my-front-end"),
    environment: {
      QUEUE_NAME: myQueueProcessingService.sqsQueue.queueName
    }
  });

myQueueProcessingService.sqsQueue.grantSendMessages(myFunction);

const myApi = new apigateway.LambdaRestApi(
  this, "MyFrontendApi", {
    handler: myFunction
  });

このコードは対応する JSON や YAML よりも、読みやすくメンテナンスしやすいのではないでしょうか。ちなみに、この場合の cdk synth は、800 行を超えるプレーン CloudFormation YAML を出力します。

Python の例
2 つ目のプロジェクトでは、Python を使用しました。

cdk init app --language=python

10 分ごとに実行する Lambda 関数を構築します。

Python で CDK プロジェクトを初期化すると、virtualenv がセットアップされます。 uVirtualenv をアクティブにすると、プロジェクト要件をインストールすることができます。

source .env/bin/activate

pip install -r requirements.txt

アクティブな virtualenv からエディタを起動しないと、Visual Studio Code などの一部のエディタでは Python の自動補完が機能しない場合があります。

スタック内には、Lambda 関数を定義する Python コードと、この関数をターゲットとして定期的に呼び出す CloudWatch Event ルールがあります。

myFunction = aws_lambda.Function(
    self, "MyPeriodicFunction",
    code=aws_lambda.Code.asset("src"),
    handler="index.main",
    timeout=core.Duration.seconds(30),
    runtime=aws_lambda.Runtime.PYTHON_3_7,
)

myRule = aws_events.Rule(
    self, "MyRule",
    schedule=aws_events.Schedule.rate(core.Duration.minutes(10)),
)
myRule.add_target(aws_events_targets.LambdaFunction(myFunction))

繰り返しますが、AWS CDK の詳細を知らなくても、理解しやすいものと思います。たとえば、期間には時間単位が含まれている場合、それが秒、ミリ秒、または日数のどれで表されているのかを考える必要はありません。この場合の cdk synth の出力は、90 行を超えるプレーン CloudFormation YAML です。

今すぐ利用可能です
AWS CDK のご利用に料金はかかりません。ツールがデプロイした AWS リソースに対しては料金が発生します。

CDKを今すぐご利用になるには、こちらのステップバイステップのオンラインチュートリアルから始めましょう。

このリポジトリには、いろんなプログラミング言語を使用した CDK プロジェクトの例が数多くあります。

https://github.com/aws-samples/aws-cdk-examples

こちらに、独自のコンストラクトを作成するための詳細があります。

AWS CDK はオープンソースです。より優れたツールにしていくためにも、あなたもぜひ参加してください。

https://github.com/awslabs/aws-cdk

GitHub でソースコードをチェックする、TypeScript か Python を使って今学んだインフラストラクチャを構築する、C# や Java のような開発者プレビューにあるいろんな言語を試すなど、最初の一歩を踏み出しましょう。フィードバックをお待ちしています。