AWS SAMプロジェクトをAmazon CodeCatalystのパイプラインを使ってLambdaにデプロイする
はじめに
この記事では、ローカル環境下で作成したAWS SAMプロジェクトをAWS CodeCatalyst上のパイプライン機能を用いてLambdaにデプロイしてみます。
記事の流れは以下の通りです。
- AWS SAM CLIを使ってローカルでSAMプロジェクトを作成&ビルドする
- ローカルのSAMプロジェクトをCodeCatalyst にプッシュする
- CodeCatalystでパイプラインを構築する
- 構築したパイプラインを経由してSAMプロジェクトをLambdaにデプロイする
1. 前提条件
以下が実施済みであること
- AWS CLIの導入
- AWS CLIにIAMユーザを紐づけておく
- AWS SAM CLIの導入
- CodeCatalystの初期設定が完了している
CodeCatalystの初期設定については以下ご参考ください。
2. SAMプロジェクトの作成およびリポジトリの紐づけ
ここではローカル環境下でSAMプロジェクトを作成します。
その後、作成したSAMプロジェクトとCodeCatalyst上のリポジトリを紐づけます。
■ SAMプロジェクトを作成する
任意のディレクトリ配下で「sam init」コマンドを使ってSAMプロジェクトを作成する。
sam init
実行時ログ&選択肢
$ sam init
You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Data processing
3 - Hello World Example with Powertools for AWS Lambda
4 - Multi-step workflow
5 - Scheduled task
6 - Standalone function
7 - Serverless API
8 - Infrastructure event management
9 - Lambda Response Streaming
10 - Serverless Connector Hello World Example
11 - Multi-step workflow with Connectors
12 - GraphQLApi Hello World Example
13 - Full Stack
14 - Lambda EFS example
15 - DynamoDB Example
16 - Machine Learning
Template: 1
Use the most popular runtime and package type? (Python and zip) [y/N]: N
Which runtime would you like to use?
1 - aot.dotnet7 (provided.al2)
2 - dotnet8
3 - dotnet6
4 - go (provided.al2)
5 - go (provided.al2023)
6 - graalvm.java11 (provided.al2)
7 - graalvm.java17 (provided.al2)
8 - java21
9 - java17
10 - java11
11 - java8.al2
12 - nodejs20.x
13 - nodejs18.x
14 - nodejs16.x
15 - python3.9
16 - python3.8
17 - python3.12
18 - python3.11
19 - python3.10
20 - ruby3.3
21 - ruby3.2
22 - rust (provided.al2)
23 - rust (provided.al2023)
Runtime: 18
What package type would you like to use?
1 - Zip
2 - Image
Package type: 1
Based on your selections, the only dependency manager available is pip.
We will proceed copying the template using pip.
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N
Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: N
Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]: y
Structured Logging in JSON format might incur an additional cost. View https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-pricing for more details
Project name [sam-app]: sam-python-lambda
Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)
-----------------------
Generating application:
-----------------------
Name: sam-python-lambda
Runtime: python3.11
Architectures: x86_64
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
Configuration file: sam-python-lambda\samconfig.toml
Next steps can be found in the README file at sam-python-lambda\README.md
Commands you can use next
=========================
[*] Create pipeline: cd sam-python-lambda && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-python-lambda && sam validate
[*] Test Function in the Cloud: cd sam-python-lambda-0730 && sam sync --stack-name {stack-name} --watch
■ SAMプロジェクトをビルドする
「sam build」コマンドを使ってSAMプロジェクトをビルドする。
「Build Succeeded」と表示されればビルド完了。
sam build
実行時ログ&選択肢
$ sam build
Starting Build use cache
Manifest is not changed for (ApplicationLayer), running incremental build
Building layer 'ApplicationLayer'
WARNING: Layer 'ApplicationLayer' has BuildArchitecture arm64, which is not listed in
CompatibleArchitectures
Running PythonPipBuilder:CopySource
Running PythonPipBuilder:CopySource
Building codeuri: D:\repo\lecture-repo\src runtime: python3.11 metadata: {} architecture: arm64
functions: HandlerFunction
requirements.txt file not found. Continuing the build without dependencies.
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam\build
Built Template : .aws-sam\build\template.yaml
Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided
■ CodeCatalystのリポジトリと紐づける
CodeCatalystで空のリポジトリを作成する。
作成したSAMプロジェクトとリポジトリを紐づける。
$ git remote add origin リポジトリのURL
SAMプロジェクトをCodeCatalystのリポジトリにプッシュする。
$ git push -u -origin --all
3.CodeCatalystのパイプラインを構築する
ここではCodeCatalyst上の画面を操作しパイプラインを構築します。
■ Environmentを作成する
パイプライン実行のためのEnvironment(AWSアカウントID/ロール情報など)を作成する。
CodeCatalystで以下画面に遷移し、「Create Environment」ボタンをクリックする。
- 「CI/CD」→「Environment」
以下項目を入力後、「Create Environment」ボタンをクリックしEnvironmentを作成する。
- Environment Name:適当な名称を決める
- AWS Account connection:ドロップダウンリストからAWSアカウントIDを選択
- Default IAM role:CodeCatalyst用のロールを選択
■ Workflow作成画面に遷移する
CodeCatalystで以下画面に遷移する。
- 「CI/CD」→「Workflow」
「Create workflow」ボタンからワークフローを新規作成する。
■ Actionの追加
左上の「Action」をクリックする。
検索窓に「SAM」と入力し検索する。
検索結果の「Deploy with AWS SAM」の「+」ボタンをクリックし、Actionを追加する。
■ Actionの編集
追加したアクションの設定画面にて「Configration」タブを開く。
以下項目を入力後、「Commit」ボタンをクリックし設定内容を保存する。
- Action name:アクションの名前を適当に決める
- Compute Type:パイプラインの動作形式(EC2かLambdaがあるがどちらでもよい)
- Environment:作成したEnvironmentを選択する
- Stack Name:Lambdaのデプロイに使用するCloudFormationのスタック名を適当に決める
4.CodeCatalystのパイプラインを実行しLambdaにデプロイする
ここでは構築したパイプラインを経由させてリポジトリの内容をLambdaにデプロイします。
■ CodeCatalystのパイプラインを実行する
作成したワークフロー画面を開き、「Run」をクリックするとパイプラインが実行される。
※デフォルトではリポジトリに変更が行われると自動で実行される。
パイプラインが正常に終了することを確認する。
■ Lambdaにデプロイされていることを確認する
AWSマネジメントコンソールからLambdaにデプロイされていることを確認する。
Discussion