Amazon Web Services ブログ

サーバーレス LAMP スタック – Part 5: CDK コンストラクトライブラリ

本投稿は AWS サーバーレス アプリケーションのシニアデベロッパーアドボケートである Benjamin Smith による寄稿です。

本シリーズの他のパートは以下のリンクからアクセスできます。また、関連するサンプルコードはこちらの GitHub リポジトリにあります。


この投稿では、サーバーレス LAMP スタック用の新しい CDK コンストラクトライブラリが、開発者によるサーバーレス PHP アプリケーションの構築にどのように役立つかを学びます。

AWSクラウド開発キット(AWS CDK)は、クラウドアプリケーションリソースをコードで定義するためのオープンソースソフトウェア開発フレームワークです。開発者は、TypeScript、Python、C#、Javaなどの使い慣れたプログラミング言語でインフラストラクチャを定義できます。開発者は、インターフェイス、ジェネリクス、継承、メソッドアクセス修飾子など、言語が提供する機能を利用できます。AWS Construct ライブラリは、CDK アプリケーションで AWS リソースを定義するための API を公開するモジュールの広範なセットを提供します。

「サーバーレス LAMP スタック」ブログシリーズでは、ベストプラクティス、コード例、多くのサーバーレスコンセプトの詳細を紹介し、これらが PHP アプリケーションにどのように適用されるかを示しています。また、PHP 開発者のインスピレーションを刺激するのに役立つ、コミュニティからの貴重な貢献に焦点を当てています。

このサーバーレス LAMP スタックの各コンポーネントについては、一連のブログ記事で詳しく説明しています。

サーバーレス LAMP スタック用の CDK コンストラクトライブラリは、AWS デベロッパーアドボケートである Pahud Hsiehによって作成された抽象概念です。サーバーレス LAMP スタックを構成するすべてのリソースを定義するための単一の高レベルコンポーネントを提供します。

サーバーレス LAMP スタックの CDK コンストラクト

  1. Amazon API Gateway HTTP API
  2. bref-fpm ランタイムが設定された AWS Lambda
  3. Amazon RDS Proxy が有効になっている Amazon Aurora for MySQL データベースクラスター

AWS CDK コンストラクトで PHP アプリケーションを構築する理由

複雑な Web アプリケーションをゼロから構築することは、時間のかかるプロセスです。 Laravel や Symfony などの PHP フレームワークは、Web アプリケーションを構築するための構造化および標準化された方法を提供します。テンプレートと汎用コンポーネントを使用すると、全体的な開発作業を軽減できます。サーバーレスアプローチを使用すると、スケーラビリティとインフラストラクチャ管理の従来の LAMP スタックの課題に対処するのに役立ちます。 AWS CDK 構成ライブラリを使用してこれらのリソースを定義すると、開発者はコードと同じフレームワーク原則をインフラストラクチャに適用できます。

AWS CDK によって、新規開発者でも迅速かつ簡単に参画できるようになります。コードベースのサイズを小さくすることによる読みやすさの向上に加えて、PHP 開発者は既存のスキルとツールを使用してクラウドインフラストラクチャを構築できます。オブジェクト、ループ、条件などの使い慣れた概念は、認知のオーバーヘッドを減らすのに役立ちます。同じコードベース内で PHP アプリケーションの LAMP スタックインフラストラクチャを定義すると、コンテキストの切り替えが減り、プロビジョニングプロセスが合理化されます。CDK コンストラクトを使って、最小限のコードでサーバーレス LAMP インフラストラクチャを迅速にデプロイしましょう。

コードは負債です。AWS CDK を使用すると、サーバーレスの最初の考え方をインフラコードに適用して、他の人が維持する抽象化を作成して、不要にすることができます。コードを削除するのが大好きなのです。

CDKパターン(CDK ベースのアーキテクチャパターンのオープンソースリソース)の作成者である Matt Coulter 氏

ServerlessLaravel コンストラクトを使用したサーバーレス Laravel アプリケーションの構築

cdk-serverless-lamp  コンストラクトライブラリは aws/jsii を利用して構築され、npm と Python モジュールとして公開されています。スタックは TypeScript または Python のいずれかにデプロイされ、 ServerlessLaravel  コンストラクトが含まれます。これにより、PHP 開発者はサーバーレス Laravelアプリケーションを簡単にデプロイできます。

まずは「TypeScript での AWS CDK の使用」の手順に従って、TypeScript 用の AWS CDK 環境を準備します。
次の手順でサーバーレスLAMPスタックをデプロイします。

  1. CDK CLI を確認します。
    $ cdk –version
  2. AWS CDK を使用して新しい Laravel プロジェクトを作成します。
    $ mkdir serverless-lamp && cd serverless-lamp
  3. AWS CDK および Laravel プロジェクトのディレクトリを作成します。
    $ mkdir cdk codebase
  4. docker を使用して新しい Larave lプロジェクトを作成します。
    $ docker run --rm -ti \
    --volume $PWD:/app \
    composer create-project --prefer-dist laravel/laravel ./codebase

cdk-serverless-lamp  コンストラクトライブラリは、Lambda 関数内で PHP コードを実行できるように bref-fpm カスタムランタイムを利用します。bref ランタイムは、FastCGI プロトコルを介して HTTP リクエストを転送することにより、Apache または NGINX と同様の機能を実行します。この詳細は、「サーバーレス LAMP スタック – Part 3: Webサーバーの置き換え」で説明されています。これに加えて、laravel-bridgeという名前の bref パッケージによって、Lambda で動作するように Laravel を自動的に構成できます。これにより、「サーバーレスLAMPスタック – Part 4: サーバーレス Laravel アプリの構築」で詳述されている構成の一部を手動で実装する必要がなくなります。

  1. bref/bref および bref/laravel-bridge パッケージをインストールします。
    $ cd codebase
    $ docker run --rm -ti \
    --volume $PWD:/app \
    composer require bref/bref bref/laravel-bridge
  2. typescript を使用して AWS CDK プロジェクトを初期化します。
    $ cd ../cdk
    $ cdk init -l typescript
  3. cdk-severless-lamp  npmモジュールをインストールします。
    $ yarn add cdk-serverless-lamp

これにより、次のディレクトリ構造が作成されます。
.
├── cdk
└── codebase

cdk  ディレクトリには、AWS CDK のリソース定義が含まれています。codebase ディレクトリには Laravel プロジェクトが含まれています。

AWS CDK を使用した Laravel プロジェクトの構築

./lib/cdk-stack.ts  の内容を以下に書き換えます。

import * as cdk from '@aws-cdk/core';
import * as path from 'path';
import { ServerlessLaravel } from 'cdk-serverless-lamp';

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

    new ServerlessLaravel(this, 'ServerlessLaravel', {
      brefLayerVersion: 'arn:aws:lambda:<<region>>:123456789012:layer:php-74-fpm:12',
      laravelPath: path.join(__dirname, '../../codebase'),
    });
  }
}

brefLayerVersion  引数は bref PHPランタイムの AWS Lambda レイヤーのバージョン ARN を指します。bref Webサイトから正しい ARN と対応するリージョンを選択しましょう。この例では、対応する Lambda レイヤーバージョン ARNを使用して、スタックを指定のリージョンにデプロイします。

  1. スタックをデプロイします。
    cdk deploy

デプロイが完了すると、Amazon API Gateway HTTP API エンドポイントが CDK 出力で返されます。この URL で Laravel アプリケーションが提供されます。

サーバーレス LAMP スタックの CDK コンストラクトの出力

アプリケーションは bref の FPM カスタムランタイムを使用して Lambda で PHP を実行しています。このスタック全体は必要なプロパティを持つ  ServerlessLaravel コンストラクトクラスの単一のインスタンス化によってデプロイされます。

Amazon Aurora データベースの追加

ServerlessLaravel  スタックは、Amazon Aurora データベースをプロビジョニングするために DatabaseCluster コンストラクトクラスで拡張されています。このクラスターの Amazon RDS Proxy インスタンスを  ServerlessLaravel  コンストラクトに渡しましょう。

  1. ./lib/cdk-stack.ts  を編集します:
     import { InstanceType, Vpc } from '@aws-cdk/aws-ec2';
     import * as path from 'path';
     import { ServerlessLaravel, DatabaseCluster } from 'cdk-serverless-lamp';
    
     export class CdkStack extends cdk.Stack {
      constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
     const vpc = new Vpc(this, 'Vpc',{ maxAzs: 3, natGateways: 1 } )
        // the DatabaseCluster sharing the same vpc with the ServerlessLaravel
        const db = new DatabaseCluster(this, 'DatabaseCluster', { vpc, instanceType: new InstanceType('t3.small'), rdsProxy: true, })
        // the ServerlessLaravel
        new ServerlessLaravel(this, 'ServerlessLaravel', {
          brefLayerVersion: 'arn:aws:lambda:<<region>>:123456789012:layer:php-74-fpm:12',
          laravelPath: path.join(__dirname, '../composer/laravel-bref'),
          vpc, 
          databaseConfig: { writerEndpoint: db.rdsProxy!.endpoint, },
        });
      }
     }
  2. cdk diff  を実行して違いを確認します。
    $ cdk diff
    出力では、ServerlessLaravel  スタックと  DatabaseCluster  スタックに対して共有 VPC が作成されていることがわかります。単一の DB インスタンスと AWS Secrets Manager のデフォルトのシークレットを持つ Amazon Aurora DB クラスターも作成されます。cdk-serverless-lamp  コンストラクトライブラリーは、必要な AWS IAM ポリシーおよび接続ルールを設定した Amazon RDS Proxy を自動的に構成してくれます。
  3. スタックをデプロイします。
    $ cdk deploy
    ServerlessLaravel  スタックが、単一 VPC にある  DatabaseCluster  とともに実行されます。単一のLambda関数が、RDS Proxy の DB_WRITER および DB_READER 情報を Lambda 環境変数としてもつ形で自動的に構成されます。

データベース認証

Lambda 関数は、実行 IAM ロールを使用して RDS Proxy に対して認証します。RDS Proxy は、AWS Secrets Managerに保存されている認証情報を使用して、Aurora DBクラスターに対して認証します。これは、アプリケーションコードベースにデータベース資格情報を埋め込むより安全な方法です。Aurora DB クラスターと Lambda を RDS Proxy を使用して接続する詳細については「サーバーレス LAMP スタック – Part 2: リレーショナルデータベース」を参照ください。

クリーンアップ

スタックを削除するには、次を実行します:
$ cdk destroy

 

以下の動画では、サーバーレス LAMP スタックの CDK コンストラクトを使用したデプロイを紹介しています。

まとめ

この投稿では、サーバーレス LAMP スタック用の新しい CDK コンストラクトライブラリを紹介しました。それを使用してサーバーレス Laravel アプリケーションをデプロイする方法について説明しました。これを  DatabaseCluster  などの他の CDK コンストラクトと組み合わせることで、PHP 開発者は最小限のコーディングで、スケーラブルで繰り返し可能なパターンを高速で作成するためのビルディングブロックを利用できます。

サーバーレス LAMP スタックの CDK コンストラクトライブラリを使用すると、PHP開発チームは、ビルド方法を変更せずにコードの出荷に集中できます。

PHP を使用したサーバーレスアプリケーションの構築を開始してみましょう。

原文はこちらです。