CodePipelineとServerless Frameworkでビルド【CodeFamily Practices 6/7】
構成図
API GatewayとLambdaの挙動を確認するための、シンプルな構成。
- ソースステージをCodeCommit、ビルドステージをCodeBuildに設定したCodePipelineを構築。
- ビルドはServerless Frameworkを使用。
- API Gatewayへメールのタイトルと本文を指定してアクセスをすると、SNSトピックのサブスクリプションへメールを送信
- 送信に成功すると、サブジェクトとメッセージの値をレスポンス。
-
コマンド
オプション-v
は、リクエストとレスポンスの詳細を返すために入力。
メールを送るだけなら不要。
curl -v -X POST \
'https://Your-domain-name' \
-d $'{"sub": "テスト", "mes": "動作異常なし。"}'
実行結果
実際に行われているリクエストとレスポンスを出力。
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying xxx.xxx.xxx.xxx:443...
* Connected to Your-domain-name (xxx.xxx.xxx.xxx) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* CAfile: /Users/username/opt/anaconda3/ssl/cacert.pem
* CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN: server accepted h2
* Server certificate:
* subject: CN=*.DomainName
* start date: Apr 26 00:00:00 2023 GMT
* expire date: May 25 23:59:59 2024 GMT
* subjectAltName: host "Your-domain-name" matched cert's "*.DomainName"
* issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M01
* SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* h2h3 [:method: POST]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: Your-domain-name]
* h2h3 [user-agent: curl/7.84.0]
* h2h3 [accept: */*]
* h2h3 [content-length: 52]
* h2h3 [content-type: application/x-www-form-urlencoded]
* Using Stream ID: 1 (easy handle 0x7faf7c013200)
> POST / HTTP/2
> Host: Your-domain-name
> user-agent: curl/7.84.0
> accept: */*
> content-length: 52
> content-type: application/x-www-form-urlencoded
>
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
* We are completely uploaded and fine
< HTTP/2 200
< date: Tue, 02 May 2023 06:08:45 GMT
< content-type: application/json
< content-length: 49
< x-amzn-requestid: ea5fdaa9-9d87-4746-a9f1-7d129dc5d09b
< x-amz-apigw-id: ER9U_HIxtjMFzwA=
< x-amzn-trace-id: Root=1-6450a8ec-4159b6d05aea26b77a5239ff;Sampled=0;lineage=ca71e3f6:0
<
* Connection #0 to host Your-domain-name left intact
Subject: テスト Message: 動作異常なし。%
メール
構築
プラグインの使用
API Gatewayに付与するカスタムドメインの作成に、 Domain Managerプラグイン を使用。
- Domain Managerパッケージをインストール
npm install serverless-domain-manager
- インストールとドメイン作成
ドメインの作成。
serverless create_domain
Serverless frameworkのデプロイ。
serverless deploy
- リソースの削除
Serverless frameworkの削除。
serverless remove
ドメインの削除。
serverless delete_domain
コード
対応するコードはGitHubに公開しています!
- buildspec.yml
- serverless.yml
- sns.py
パイプラインの構築
ソースステージとビルドステージの二つを持つパイプラインを作成。
CodeCommitにリポジトリ(api-serverless)を作成し、ソースコードとbuildspec.ymlをプッシュ。
CodeBuildへ移動し、以下の内容でビルドプロジェクトを作成。
項目 | 設定 |
---|---|
Source provider | CodeCommit |
repository | api-serverless |
Git clone depth | 1 (デフォルト) |
Image | aws/codebuild/amazonlinux2-x86_64-standard:4.0 |
Environment type | Linux |
Artifact | No artifact |
Cache | No cache |
CloudWatch Logs | ENABLED |
CodePipelineへ移動し、パイプラインの設定を開始。
前述で作成したリポジトリを指定。
前述で作成したビルドプロジェクトを指定。
デプロイを行わないためスキップ。
設定内容を確認の上、"Create pipeline"を選択。
選択後、自動的にパイプラインを開始。
自動構築
SourceとBuild、両方のステージが成功。
CodeBuildのログを確認。
Amazon Linux2のDockerイメージを使用したコンテナで、CodeCommitからダウンロードしたBuildspec.ymlを参照。
Serverless FrameworkとDomain Managerをインストールし、リソースをデプロイ。
Domain Managerは、ホストゾーンにデフォルトでAレコードとAAAAレコードを生成。
REST APIプロキシ統合のAPI Gatewayを作成。
カスタムドメインとして登録。
Lambdaを作成。
Cloudwatch Logsのポリシーを反映。
CloudWatch Logsにロググループを作成。
SNSのポリシーを反映。
トリガーにAPI Gatewayを設定。
SNSにトピックを作成。エンドポイントは、サブスクリプションの確認メールで承認の必要あり。
まとめ
サーバーレスに特化したフレームワークなので、CloudFormationやTerraformに比べて少ない記述で構築できるところが利点。
アーキテクチャに合わせてフレームワークを活用したい。
合わせて読みたい👀👉CodeFamily Practicesの記事
CodeCommitとローカル環境の連携 【CodeFamily Practices 1/7】
CodeBuildでビルドプロジェクトを作ってみよう 【CodeFamily Practices 2/7】
CodeDeployでEC2にアプリケーションをデプロイ 【CodeFamily Practices 3/7】
CodePipelineでシンプルなパイプラインを構築してみた 【CodeFamily Practices 4/7】
CodePipelineとCloudformationで、API Gatewayをビルド【CodeFamily Practices 5/7】
CodePipelineとTerraformで、API Gatewayをビルド【CodeFamily Practices 7/7】
👀👉Serverless Framework関連の記事
Serverless Frameworkの基本的な使い方
Discussion