⚒️

AWS SAMプロジェクトをAmazon CodeCatalystのパイプラインを使ってLambdaにデプロイする

2024/08/05に公開

はじめに

この記事では、ローカル環境下で作成したAWS SAMプロジェクトをAWS CodeCatalyst上のパイプライン機能を用いてLambdaにデプロイしてみます。

記事の流れは以下の通りです。

  • AWS SAM CLIを使ってローカルでSAMプロジェクトを作成&ビルドする
  • ローカルのSAMプロジェクトをCodeCatalyst にプッシュする
  • CodeCatalystでパイプラインを構築する
  • 構築したパイプラインを経由してSAMプロジェクトをLambdaにデプロイする

1. 前提条件

以下が実施済みであること
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/prerequisites.html

CodeCatalystの初期設定については以下ご参考ください。
https://zenn.dev/is0383kk/articles/b2996a842397b4

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