Amazon Web Services ブログ
サーバーレス LAMP スタック – Part 5: CDK コンストラクトライブラリ
本投稿は AWS サーバーレス アプリケーションのシニアデベロッパーアドボケートである Benjamin Smith による寄稿です。
本シリーズの他のパートは以下のリンクからアクセスできます。また、関連するサンプルコードはこちらの GitHub リポジトリにあります。
- パート1:サーバーレス LAMP スタックの紹介
- パート2:リレーショナルデータベース
- パート3:Webサーバーの置き換え
- パート4:サーバーレス Laravel アプリの構築
- パート6:MVC からサーバーレスマイクロサービスへ
この投稿では、サーバーレス LAMP スタック用の新しい CDK コンストラクトライブラリが、開発者によるサーバーレス PHP アプリケーションの構築にどのように役立つかを学びます。
AWSクラウド開発キット(AWS CDK)は、クラウドアプリケーションリソースをコードで定義するためのオープンソースソフトウェア開発フレームワークです。開発者は、TypeScript、Python、C#、Javaなどの使い慣れたプログラミング言語でインフラストラクチャを定義できます。開発者は、インターフェイス、ジェネリクス、継承、メソッドアクセス修飾子など、言語が提供する機能を利用できます。AWS Construct ライブラリは、CDK アプリケーションで AWS リソースを定義するための API を公開するモジュールの広範なセットを提供します。
「サーバーレス LAMP スタック」ブログシリーズでは、ベストプラクティス、コード例、多くのサーバーレスコンセプトの詳細を紹介し、これらが PHP アプリケーションにどのように適用されるかを示しています。また、PHP 開発者のインスピレーションを刺激するのに役立つ、コミュニティからの貴重な貢献に焦点を当てています。
このサーバーレス LAMP スタックの各コンポーネントについては、一連のブログ記事で詳しく説明しています。
- パート1:サーバーレス LAMP スタックの紹介
- パート2:リレーショナルデータベース
- パート3:Webサーバーの置き換え
- パート4:サーバーレス Laravel アプリの構築
サーバーレス LAMP スタック用の CDK コンストラクトライブラリは、AWS デベロッパーアドボケートである Pahud Hsiehによって作成された抽象概念です。サーバーレス LAMP スタックを構成するすべてのリソースを定義するための単一の高レベルコンポーネントを提供します。
- Amazon API Gateway HTTP API
- bref-fpm ランタイムが設定された AWS Lambda
- 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スタックをデプロイします。
- CDK CLI を確認します。
$ cdk –version
- AWS CDK を使用して新しい Laravel プロジェクトを作成します。
$ mkdir serverless-lamp && cd serverless-lamp
- AWS CDK および Laravel プロジェクトのディレクトリを作成します。
$ mkdir cdk codebase
- 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 アプリの構築」で詳述されている構成の一部を手動で実装する必要がなくなります。
- bref/bref および bref/laravel-bridge パッケージをインストールします。
$ cd codebase $ docker run --rm -ti \ --volume $PWD:/app \ composer require bref/bref bref/laravel-bridge
- typescript を使用して AWS CDK プロジェクトを初期化します。
$ cd ../cdk $ cdk init -l typescript
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を使用して、スタックを指定のリージョンにデプロイします。
- スタックをデプロイします。
cdk deploy
デプロイが完了すると、Amazon API Gateway HTTP API エンドポイントが CDK 出力で返されます。この URL で Laravel アプリケーションが提供されます。
アプリケーションは bref の FPM カスタムランタイムを使用して Lambda で PHP を実行しています。このスタック全体は必要なプロパティを持つ ServerlessLaravel
コンストラクトクラスの単一のインスタンス化によってデプロイされます。
Amazon Aurora データベースの追加
ServerlessLaravel
スタックは、Amazon Aurora データベースをプロビジョニングするために DatabaseCluster コンストラクトクラスで拡張されています。このクラスターの Amazon RDS Proxy インスタンスを ServerlessLaravel
コンストラクトに渡しましょう。
./lib/cdk-stack.ts
を編集します:cdk diff
を実行して違いを確認します。
$ cdk diff
出力では、ServerlessLaravel
スタックとDatabaseCluster
スタックに対して共有 VPC が作成されていることがわかります。単一の DB インスタンスと AWS Secrets Manager のデフォルトのシークレットを持つ Amazon Aurora DB クラスターも作成されます。cdk-serverless-lamp
コンストラクトライブラリーは、必要な AWS IAM ポリシーおよび接続ルールを設定した Amazon RDS Proxy を自動的に構成してくれます。- スタックをデプロイします。
$ 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 を使用したサーバーレスアプリケーションの構築を開始してみましょう。
原文はこちらです。