Amazon Web Services ブログ

AWS CDKでエンタープライズアプリケーションを開発する

エンタープライズのお客様は、ガバナンスやコンプライアンス・品質管理のために Infrastructure as Code (IaC)を標準化しなければならない場合があります。さらに、IaCのライブラリやそのアップデートを中央集権的に管理しなければならない場合もあるでしょう。それらを実現するため、この記事では AWS Cloud Development Kit (AWS CDK) を利用してIaCのパターンを定義する方法や、AWS CodeArtifactを利用してIaCの更新リリースを統制する方法を紹介します。

AWS CDKは、クラウドリソースを定義・プロビジョニングするためのオープンソースの開発フレームワークです。TypeScriptやJavaScript、Python、Java、C#/.Netなどのプログラミング言語を用いて記述することが可能です。AWS CDKの基本的な構成要素はコンストラクト(Construct)と呼ばれ、1つ以上のAWSリソースに対応します。コンストラクトは組み合わせて使うことができ、AWSリソースを高度に抽象化したパターンを定義することが可能です。コンストラクトは合成(synthesize)することでAWS CloudFormationテンプレートへ変換され、AWSアカウントにデプロイできます。

AWS CodeArtifact はソフトウェアアーティファクトのライフサイクルを管理するためのフルマネージドサービスです。CodeArtifactを利用して、ソフトウェアアーティファクトを安全に保持・公開・共有することができます。CodeArtifactでは、ソフトウェアアーティファクトが格納されるリポジトリを集約したドメインを構成することができます。CodeArtifactのドメインを使うと、リポジトリを横断して組織の管理ポリシーを適用することが可能です。CodeArtifactは、一般的なビルドツールやパッケージマネージャ(NuGet, Maven, Gradle, npm, yarn, pip, twineなど)に統合して利用することができます。

ソリューションの全体像

このソリューションでは、以下の手順を紹介します:

  1. AWS CDKのコンストラクトを2つ、TypeScriptで作成します。1つは古典的な3層ウェブアプリケーションで、もう1つはサーバーレスウェブアプリケーションです。
  2. 上記のコンストラクトを、CodeArtifactを利用してnpmパッケージとして公開します。npmはNode.jsのパッケージマネージャです。
  3. 上記のnpmパッケージをCodeArtifactから取得し、AWSインフラストラクチャをプロビジョニングします。

後述の章に、上記コンストラクトに関して詳細な情報を記載しています。また、本記事で利用するソースコードは GitHub からアクセス可能です。

注意: 本記事のコードはデモを目的としたものです。ご利用の際は、お客様のセキュリティ水準や必要条件を満たしていることを確認してください。

古典的な3層ウェブアプリケーションのコンストラクト

1つ目のコンストラクトは3層ウェブアプリケーションです。Amazon Elastic Compute Cloud (Amazon EC2) 上で動作し、Application Load BalancerAuto Scaling グループEC2起動設定Amazon Relational Database Service (Amazon RDS) または Amazon Aurora データベースAWS Secrets Manager のリソースで構成されます。アーキテクチャは下図の通りです。

サーバーレスウェブアプリケーションのコンストラクト

2つ目のコンストラクトは、サーバーレスウェブアプリケーションです。AWS LambdaAmazon API GatewayAmazon DynamoDBで構成されます。

コンストラクトを公開・利用する

2つのコンストラクトはともにTypeScriptで書かれており、npmパッケージとしてCodeArtifactに公開することができます。また、パッケージのバージョン指定はセマンティックバージョニングに従います。パッケージがCodeArtifactに公開されると、チームはそれらを取得してAWSリソースをデプロイすることが可能になります。アーキテクチャは下図の通りです。

準備

デプロイ前の準備として、次の手順を実行してください:

  1. GitHubからコンストラクトのコードをcloneします
    git clone https://github.com/aws-samples/aws-cdk-developing-application-patterns-blog.git
    cd aws-cdk-developing-application-patterns-blog
  2. AWS Identity and Access Management (IAM)を設定します。このソリューションで利用するIAMユーザー・グループ・ロールにIAMポリシーをアタッチしてください。ポリシーはリポジトリの iamディレクトリにある下記ファイルを参照します:
    • BlogPublishArtifacts.json – CodeArtifactを設定・パッケージを公開するためのIAMポリシーです
    • BlogConsumeTraditional.json – 古典的な3層ウェブアプリケーションのコンストラクトをCodeArtifactから取得し、AWSアカウントにデプロイするためのIAMポリシーです
    • PublishArtifacts.json – サーバーレスウェブアプリケーションのコンストラクトをCodeArtifactから取得し、AWSアカウントにデプロイするためのIAMポリシーです

CodeArtifactの設定

この手順では、コンストラクトをnpmパッケージとして公開できるようにCodeArtifactを設定します。これにより、次のAWSリソースが作成されます:

  • CodeArtifactのドメイン(blog-domain )
  • 2つのCodeArtifactリポジトリ
    • blog-npm-store – アップストリームのNPMリポジトリ
    • blog-repository – 自前のパッケージを公開するためのリポジトリ

次のコマンドを実行して、CodeArtifactのリソースをデプロイしてください:

cd prerequisites/
rm -rf package-lock.json node_modules
npm install
cdk deploy --require-approval never
cd ..

次にblog-repository にログインします。この手順はnpmパッケージを公開・取得するために必要です。以下のコマンドを実行してください:

aws codeartifact login \
     --tool npm \
     --domain blog-domain \
     --domain-owner $(aws sts get-caller-identity --output text --query 'Account') \
     --repository blog-repository

コンストラクトを公開する

  1. サーバーレスコンストラクトのディレクトリに移動します
    cd serverless
  2. 必要なnpmパッケージをインストールします
    rm package-lock.json && rm -rf node_modules
    npm install
  3. npmプロジェクトをビルドします
    npm run build
  4. コンストラクトのnpmパッケージを、CodeArtifactリポジトリに公開します
    npm publish

3層ウェブアプリケーションの場合は、ディレクトリをtraditionalに変更した上で、上記と同様の手順を実行してください。

公開が成功すると、以下のスクリーンショットに示したメッセージが表示されます。以下は、3層ウェブアプリケーションの場合です。

以下は、サーバーレスアプリケーションの場合です。

上記の手順では両方のコンストラクトについて、v1.0.1 を公開しました。新しいバージョンをリリースする際は、traditional/serverlessディレクトリ内にある package.jsonのversion属性を更新し、最後の2つの手順を再実行します。

以下のコードスニペットは3層ウェブアプリケーションの例です:

{
    "name": "traditional-infrastructure",
    "main": "lib/index.js",
    "files": [
        "lib/*.js",
        "src"
    ],
    "types": "lib/index.d.ts",
    "version": "1.0.1",
...
}

以下はサーバーレスアプリケーションの例です:

{
    "name": "serverless-infrastructure",
    "main": "lib/index.js",
    "files": [
        "lib/*.js",
        "src"
    ],
    "types": "lib/index.d.ts",
    "version": "1.0.1",
...
}

CodeArtifactからコンストラクトを取得する

この手順では、先程の手順で公開したコンストラクトを利用してAWSインフラストラクチャをプロビジョニングする方法を示します。

  1. 先程のGitHubリポジトリのルートディレクトリから、exampleディレクトリに移動します。ここには、先ほどCodeArtifactに登録した3層ウェブアプリケーションやサーバーレスアプリケーションのコンストラクトを利用するコードが含まれます。3層ウェブアプリケーションを利用する際は、以下のコマンドを実行してください:
    cd examples/traditional

    サーバーレスアプリケーションを利用する際は、以下のコマンドを実行してください:

    cd examples/serverless
  2. package.jsonを開き、利用したいパッケージが dependencies セクションに正しいバージョンで記入されていることを確認します。以下のコードは、3層ウェブアプリケーションコンストラクトのdependenciesです:
    "dependencies": {
        "@aws-cdk/core": "1.30.0",
        "traditional-infrastructure": "1.0.1",
        "aws-cdk": "1.47.0"
    }

    以下のコードは、サーバーレスコンストラクトのdependenciesです:

    "dependencies": {
        "@aws-cdk/core": "1.30.0",
        "serverless-infrastructure": "1.0.1",
        "aws-cdk": "1.47.0"
    }
  3. コンストラクトのnpmパッケージをインストールします:
    rm package-lock.json && rm -rf node_modules
    npm install
  4. (オプショナルな手順) デフォルトのLambda関数のコードを上書きする必要がある場合は、npmプロジェクトをビルドしてください。以下のコマンドを実行すると、Lambda関数のコードがビルドされます:
    cd ../override-serverless
    npm run build
    cd -
  5. プロジェクトをbootstrapします:
    cdk bootstrap

    この手順はサーバーレスアプリケーションでのみ必要です。この手順により、Lambda関数コードやアーティファクトを保存するためのAmazon Simple Storage Service (Amazon S3)バケットが作成されます。

  6. コンストラクトをデプロイします:
    cdk deploy --require-approval never

    デプロイが成功すると、以下のスクリーンショットに示したメッセージが表示されます。以下は3層ウェブアプリケーションのスクリーンショットで、URLはLoad Balancerのエンドポイントです。

    以下はサーバーレスアプリケーションのスクリーンショットで、URLはAPI Gatewayのエンドポイントです。

    両コンストラクトのエンドポイントは、ウェブブラウザを使うか、下記のcurlコマンドで確認することが可能です。
    curl <endpoint output>

    3層ウェブアプリケーションは、次のようなレスポンスを返します:
    [{"app": "traditional", "id": 1605186496, "purpose": "blog"}]

    サーバーレスのスタックは2つのOutputがありますが、ServerlssStack-v1.Apiの方を利用してください。これは次のようなレスポンスを返します:
    [{"purpose":"blog","app":"serverless","itemId":"1605190688947"}]

  7. (オプショナルな手順) コンストラクトを新しいバージョンにアップグレードします。
    ここではコンストラクトの新しいバージョンv1.0.2が公開され、AWSインフラストラクチャをそのバージョンにアップグレードしたい場合を考えます。そのためには、package.jsonを開き、traditional-infrastructureserverless-infrastructureパッケージのバージョンを1.0.2に変更します。以下のコード例を参照してください:

    "dependencies": {
        "@aws-cdk/core": "1.30.0",
        "serverless-infrastructure": "1.0.2",
        "aws-cdk": "1.47.0"
    }

    以下のコマンドを実行して、パッケージをアップデートします:

    npm update

    さらに、CloudFormationスタックを再デプロイします:

    cdk deploy --require-approval never

クリーンアップ

不要なコスト請求を防止するため、作成したリソースをクリーンアップしましょう。

  1. コンストラクトにより作成されたすべてのAWSリソースを削除します。以下のようにAWS CDKツールキットを利用できます:
    cdk destroy --force

    AWS CDKツールキットに関する詳細は、Toolkit referenceをご覧ください。別の方法として、AWS CloudFormationコンソールからスタックを削除することも可能です

  2. CodeArtifactリソースも同様の方法で削除します:
    cd prerequisites
    cdk destroy --force

まとめ

この記事では、AWS CDKのコンストラクトをCodeArtifactにnpmパッケージとして公開する方法を紹介しました。また、公開されたコンストラクトを取得して、AWSインフラストラクチャをプロビジョニングする方法もお見せしました。

この仕組みにより、デプロイされるAWSインフラストラクチャが必要な品質管理やセキュリティ・ガバナンスのチェックを通過したことを保証するように構成できます。また、新しいコンストラクトのバージョンがリリースされるタイミングと、開発チームがそれらを取得してアップグレードするタイミングを制御することも可能になります。

本記事の翻訳はSolutions Architectの友岡 雅志が担当しました。原文はこちら