Amazon Web Services ブログ

AWS Proton の AWS CDK サポートと CodeBuild プロビジョニングの発表

この記事は Announcing AWS CDK Support and CodeBuild Provisioning for AWS Proton (記事公開日: 2022 年 11月 16 日) を翻訳したものです。

イントロダクション

本日、AWS Proton は CodeBuild プロビジョニングを発表しました。これにより、お客様は一連のコマンドを定義し、AWS Proton を介した Infrastructure as Code (IaC) テンプレートのデプロイ方法を選択できます。CodeBuild プロビジョニングを使用すると、お客様はテンプレートの定義時に AWS Cloud Development Kit (AWS CDK) などのお好みの IaC ツールを使用することが可能になります。本機能リリース以前は、IaC ツールとして AWS CloudFormation または Hashicorp Terraform に限定されており、リソースのデプロイには AWS Proton が提供する独自のワークフローに従う必要がありました。CodeBuild プロビジョニングを使用することで、お客様は選択した IaC ツールのデプロイメントロジックをより自由にコントロールすることができます。

AWS CDK を使った AWS Proton テンプレートのプロビジョニングは、AWS Proton のロードマップで最も要望の多かった機能の 1 つであり、このプロビジョニング方法を構築するきっかけとなりました。Python や TypeScript などの使い慣れたプログラミング言語を使用して、希望のインフラストラクチャ定義を表現しながら、エンドユーザー向けにセルフサービスの開発者用ポータルを構築したいというお客様の要望は明らかです。AWS CDK はこの機能の開始に大きな役割を果たしますが、この機能が AWS CDK に限定されないことも重要です。IaC ツール (例えば、Pulumi または Terraform [プルリクエストプロビジョニングで現在サポートされているモード以外] ) を使用するお客様が、独自のカスタム手順でデプロイするための扉を開くことができるのです。

AWS CDK を使用して定義したインフラストラクチャを、AWS Proton を使用してセルフサービスインターフェースを構築し、CodeBuild プロビジョニングでリソースをデプロイするデモを見ていきましょう。この記事では、AWS Proton のコンセプトを高いレベルで説明し、必要であればさらに理解を深めるためのリンクを提供します。デモをすぐに開始したい場合は、この記事のウォークスルーセクションに進んでください。

AWS Proton と AWS CDK を一緒に使用する利点

お客様が AWS CDK を使用する際に利用する一般的なユースケースは、Constructs と呼ばれる再利用可能なライブラリを作成することです。これにより、チームはインフラストラクチャを定義するときに再利用される共通のパターンセットを定義できます。これらのライブラリを公開するには、お客様にてバージョン管理する必要があります。これはソフトウェアを提供するために推奨されるプラクティスですが、お客様が組織全体で使用されているソフトウェアのバージョンを把握しようとすると問題が発生します。AWS Proton では組み込みテンプレートのバージョン管理があるので、お客様はどのバージョンの IaC ソフトウェアがどこにデプロイされているかを把握できるようになります。では、AWS CDK を使用して定義された環境とサービスのテンプレートバンドルのサンプルを見てみましょう、次に AWS Proton でそれらを作成してデプロイする方法について説明します。

ソリューションの概要

テンプレート バンドルのレビュー

Proton のテンプレートバンドルは、リソースの望ましい状態を汎用的/再利用可能に定義する IaC テンプレート、必須/オプションの入力を定義するスキーマファイル、IaC テンプレートをプロビジョニングするメカニズムを定義するマニフェストで構成されています。リソースをプロビジョニングおよびデプロビジョニングする手順は、マニフェストファイルで定義されます。以下は、AWS CDK デプロイメント用のマニフェストファイルの例です。

infrastructure:
  templates:
    - rendering_engine: codebuild
      settings:
        image: aws/codebuild/amazonlinux2-x86_64-standard:4.0
        runtimes:
          nodejs: 16
        provision:
          - npm install
          - cdk deploy --require-approval never
          - chmod +x ./cdk-to-proton.sh
          - cat proton-outputs.json | ./cdk-to-proton.sh > outputs.json
          - aws proton notify-resource-deployment-status-change --resource-arn $RESOURCE_ARN --status IN_PROGRESS --outputs file://./outputs.json
        deprovision:
          - npm install
          - cdk destroy --force

まず、rendering_engine の値を codebuild と設定し、必要な設定を渡します。次に、CodeBuild のジョブで使用するコンテナイメージを設定します。この例では、cdk プロジェクトに TypeScript を使用しています。つまり、nodejs のインストールが必要なので、runtimes で設定します。次に、リソースのプロビジョニングとデプロビジョニングのステップを定義します。このステップは、AWS CDK を使用している人には馴染みのあるもので、単に依存関係をインストールし、IaC をデプロイするだけです。ユーザーが環境やサービスをプロビジョニングするとき、AWS Proton は cdk プロジェクトのコードに入力値を提供する必要があります。AWS Proton では、プロビジョニングプロセスの一環として、ファイル (proton-inputs.json) を提供します。このファイルは、サービスがプロビジョニングされたときにコードが入力値と共有環境の出力をレンダリングできます。以下は、環境サンプルの 1 つの入力ファイルの例です。

{
  "environment": {
    "name": "cdk-environment-demo",
    "inputs": {
      "ec2_capacity": false,
      "ec2_instance_type": "t3.medium",
      "allow_ecs_exec": false,
      "enhanced_cluster_monitoring": false,
      "service_discovery_namespace": "cdkdemo.svc.local"
    }
  }
}

最後に、cdk プロジェクトの出力を取得し、デプロイ後に AWS Proton に送信するために必要な形式に整理するヘルパースクリプトが提供されています。これは、上記のマニフェストの最後のステップです。CodeBuild プロビジョニングの作業に関する詳細は、こちらのドキュメントを参照してください。デプロイ手順を定義する方法を理解したので、テンプレートを作成し、そのテンプレートから開発環境をデプロイする手順について説明します。

ウォークスルー

まず、環境のテンプレートバンドルを作成し、最初のバージョンを公開します。このテンプレートバンドルには、Amazon Virtual Private Cloud (VPC)、Amazon Elastic Container Service (Amazon ECS) クラスター、スキーマの入力に基づくいくつかのオプションリソースを定義する cdk プロジェクトのコードが含まれています。テンプレートバンドルのサンプルは、ここで参照できます。AWS Proton の「環境」はアプリケーション間で共有されるリソースと考えることができます。環境は一般的にデプロイ環境 (テスト、ステージング、本番など) ごとに分離されており、ビジネスの垂直方向 (例: 会計、開発) に合わせる場合もあります。

AWS Proton でテンプレートを同期するには、現在 2 つの方法があります。Amazon Simple Storage Service (Amazon S3) バケットに格納されたアーティファクトテンプレートバンドルを指定するか、Template Sync という機能を使って GitHub などのバージョンコントロール内のテンプレートリポジトリを指定する方法です。このチュートリアルでは、環境テンプレートをパッケージ化して Amazon S3 バケットにプッシュしますが、推奨されるアプローチは、テンプレートを信頼できる 1 つのソースで変更管理するための Git を提供する Template Sync を使用することです。さらに、AWS Proton は Git コミットに基づいてテンプレートのバージョンアップを自動的にステージングするので、お客様独自で自動化を構築する必要がありません。

サンプルリポジトリで、AWS Proton に公開したいテンプレートのディレクトリである cdk/environment-templates/vpc-ecs-cluster/v1 に移動し、以下のコマンドを実行してテンプレートバンドルのパッケージ化と Amazon S3 へのプッシュを行いましょう。

tar -zcvf cdkDemoEnv.tar.gz infrastructure schema
aws s3 cp cdkDemoEnv.tar.gz s3://proton-templates-demo-account/

次に、AWS Proton のコンソールに移動して、テンプレートバンドルをアップロードし、公開しましょう。サイドバーのTemplates – Environment templates を選択します。そして、Create environment template を選択します。

Screenshot of the Proton console, creating new environment template

ここでは、テンプレートバンドルのソースと、セルフサービスインターフェイスでエンドユーザーにテンプレートを提供する方法に関する内容を定義します。さらに、テンプレートの説明セクションにテンプレートに関連する情報を追記することをお勧めします。値を設定したら、Create environment template を選択します。

Screenshot: Proton console - creating environment template

次の画面では、作成したテンプレートバンドルの概要と、バージョン管理を含むテンプレートの詳細が表示されます。Publish v1.0 を選択すると、最初の環境をデプロイする準備が整います。

Proton console view of pending template pending publishing

StatusPublished と表示されているのが確認できるはずです。

次のステップで、セルフサービスインターフェイスを使用して環境をデプロイします。サイドバーに戻り、Environments – Create environment の順に選択します。

使用可能な環境テンプレートが表示されます。このデモでは、AWS CDK 環境テンプレートから 1 つだけ選択することができます。テンプレートのラジオボタンを選択し、Configure を選択します。

環境に関するいくつかの前提条件を設定します。まず、環境をデプロイするアカウントを選択します。AWS Proton でマルチアカウントアクセスを設定するには、Environment account connections を確認してください。次に、環境のわかりやすい名前と説明を入力します。次のセクションは重要です、テンプレートに定義されたリソースをデプロイする際にプロビジョニングメソッドが引き受ける AWS Identity and Access Management (AWS IAM) ロールを選択します。これは、適切なポリシーがアタッチされていて CodeBuild サービスが引き受けることができるロールを Codebuild provisioning role セクションに設定します。CodeBuild プロビジョニングロールの詳細については、AWS のドキュメントを参照してください。また、AWS-managed provisioning role セクションがあることに気付くかもしれません。AWS マネージドプロビジョニングを使用している他の AWS Proton サービスをこの環境にデプロイできるようにする場合、ここでロールを追加します。最後に、これらのロールは AWS Proton がこの環境をデプロイする時だけでなく、この環境にローンチするすべてのサービスにも使用されます。すべての情報が入力されたら、Next を選択します。

Proton console setting up a new environment step one.

次の画面では、テンプレートバンドルに渡す設定情報を入力します。これらの入力は、テンプレートバンドルに含まれる schema.yaml ファイルで定義されます。ここでは service discovery namespace を入力して、それ以外はデフォルトのままとし、NextCreate を選択します。

Proton console showing inputs required to deploy the environment created earlier in the post.

次に、AWS Proton がテンプレートバンドルをデプロイ可能なアーティファクトにレンダリングし、上記のアーティファクトを使用して CodeBuild ジョブを起動し、マニフェストファイルで定義されているデプロイ手順を実行します。CodeBuild プロビジョニングを使用して初めてローンチする場合、AWS Proton は最初に CodeBuild ジョブを作成します。AWS Proton がインフラリソースをデプロイしている間、CodeBuild provisioning タブに移動し、ログイベントを通じてデプロイステータスの進行状況を確認できます。ジョブに関する問題をさらに掘り下げてトラブルシューティングする場合は、CodeBuild ジョブのリンクを選択すると、コンソールで実行される CodeBuild ジョブにリダイレクトされます。

Proton console environment view showing codebuild provisioning logs

CodeBuild プロビジョニングを使用した AWS Proton 環境のデプロイに成功しました!

クリーンアップ

リソースをクリーンアップするには、コンソールから上記で作成した環境 (proton-blog-cdk-cb-demo という名前 ) に移動してください。右上の Actions – Delete の順に選択します。これにより CodeBuild ジョブがトリガーされ、マニフェストで定義された deprovision ステップが実行され、リソースが削除されます。

まとめ

この記事では、CodeBuild プロビジョニングにより、テンプレートのバージョン管理、セルフサービス、CI/CD パイプラインの自動化など、Proton のネイティブ機能を活用しながら、お客様が選択した IaC ツールを使用できるようになることを紹介しました。この新機能をどのように活用されているのか、お客様の声をお待ちしています。フィードバックや機能のリクエストがあれば、公開されているロードマップを通じてご連絡ください。サンプルはサンプルリポジトリに、機能についての詳細はドキュメントにアクセスしてください。

翻訳はプロフェッショナルサービスの高橋たまが担当しました。原文はこちらです。