CI/CDの勉強をするために、超簡単なアーキテクチャを作ってみました。
今回作るもの
以下がアーキテクチャです。
CodeBuildとServerless Frameworkを使用してCI/CDを作っています。
GitHubでrepositoryを作る
適当なGitHub repositoryを作成します。
今回は全てのファイルをここで作成します。
CodeCommitでもいいのですが,GitHubでも大丈夫です。
CodeBuildでbuild projectを作る
マネコンから作成します。
設定内容は以下の通りです。
Source
Source provider
今回はGitHubを選択します。
Repository
先ほど作成したRepositoryを選択します。
Source version
今回作業するブランチを設定します。
main
でもfeature/serverless
でも何でも大丈夫です。
このブランチにpushしたファイルがCodeBuildに使われます。
Environment
Managed imageをチェックして,以下の設定を行います。
ほぼデフォルトにしました。
Operationg system
aws/codebuild/amazonlinux2-x86_64-standard:4.0
Service role
CodeBuild専用のRoleを作成したあと,選択しました。
AdminstratorAccsess
を付与してあります。
詳細)
AWSジョブ機能の 管理ポリシー - AWS Identity and Access Management
Buildspec
Use a buildspec fileにチェックします。
今回はマネコンからではなく,buildspec.yml
のファイルからから設定するためです。
以上でCodeBuildの作成は終わりです。
buildspec.ymlの作成
GitHubレポジトリのrootに作成します。
#buildspecのバージョンを指定する
version: 0.2
#ビルドの各段階で実行するコマンドを書いていく
phases:
install:
commands:
- npm install -g serverless #serverlessをインストールする
build:
commands:
- sls deploy #serverless.ymlの内容をdeployする
- echo 'deploy finished!'
- sls invoke -f hello --log
パラメータの説明
version
: buildspecのバージョン。特に理由がなければ0.2を指定する。
- ちなみに存在するのは0.1と0.2だけです。(2023/5現在)
- CodeBuild のビルド仕様に関するリファレンス - AWS CodeBuild
phases
: ビルドの各段階でCodeBuildが実行するコマンドを指定する。
-
install
/pre_build
/build
/post_build
の4段階の設定ができます。 -
commands
で具体的なコマンドを指定します。上から順番に実行されていきます。
buildspec.ymlではsls deploy
だけを行います。
AWSリソースの中身はserverless.yml
で設定するのがミソです。
(今回はlambdaなのでsls invoke
も必要です。これをやらないとdeployはされてもログにHello Worldが出ません。)
serverless.ymlの作成
GitHubレポジトリのrootに以下のようなファイルを作成します。
# serverless frameworkのサービス名(プロジェクト名)を設定する
service: serverless-lambda-helloworld
provider:
name: aws #基本AWSで固定
runtime: python3.9
stage: dev
functions:
hello:
handler: handler.hello
パラメータの説明
service
: Serverless Frameworkのサービス名/プロジェクト名です。
provider
:クラウドサービスの設定を行います。
-
name
:クラウドサービスを指定します。
AWSの他にGCP,Azureなども指定できます。 -
runtime
: 言語とそのversionを指定します。
lambda functionのruntimeの設定をここで行います。 -
stage
: stageを設定します。default値はdev
です。
functions
:lambda functionの設定を行います。
helloはfunctionの名前です。
-
handler
で呼び出す関数を指定します。 -
- 今回は
handler.py
のdef hello()
を呼び出したいのでhandler.hello
と書きます。
- 今回は
-
- 別な例)
main.py
のdef hogehoge()
の場合,main.hogehoge
と書きます。
- 別な例)
もちろん、2個以上のfunctionを作ることもできます。
Serverless Framework - AWS Lambda Functions
handler.pyの作成
lambda functionの設定を書きます。
通常のlambdaと同様なので説明は割愛します。
import json
def hello(event, context):
body = {
"message": "Hello World! From serverless!",
"input": event,
}
# print("Hello World! From serverless") printだとnullになった
return {"statusCode": 200, "body": json.dumps(body)}
buildを実行する
マネコンから実行します。
先ほど作成したCode Buildの画面からstart build
をクリックすると実行されます。
CodeBuildのログにHelloWorldの文字が現れるはずです!
参考情報
- CodeBuild のビルド仕様に関するリファレンス - AWS CodeBuild
- 【初心者必見】Serverless FrameworkでAWS環境作りたいやつはこれを参考にしろ! - サーバーワークスエンジニアブログ
- Serverless Framework - AWS Lambda Guide - Serverless.yml Reference
- Serverless Framework - AWS Lambda Functions
- Serverless Framework 素振り - ngyukiの日記
- examples/aws-python at v3 · serverless/examples