虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

3ステップでサーバーレスアプリケーションを簡単作成!AWS SAMをご紹介!

皆さんこんにちは!虎の穴ラボのNSSです。
この記事は「虎の穴ラボ 夏のアドベントカレンダー」の5日目の記事です。
4日目はH.Yさんによる「Amazon WorkSpacesで色々試してみる。」が投稿されました。
6日目はS.Sさんによる「SwitchBotのAPIで家電を遠隔操作してみた」が投稿されます。

はじめに

私は約4年前にとらラボ同人誌のネタとして、
AWS サーバーレスアプリケーションモデル (以下AWS SAM)を触ったことがあるのですが、
その時よりもさらに使いやすくなっていました。

そこで、今回はおすすめのクラウドサービスとして、
AWS SAMを使用してサンプルアプリケーションをデプロイする方法を紹介します。

AWS SAMについて

AWS SAMとはサーバーレスアプリケーションを構築するためのフレームワークです。
SAMベースのアプリケーションの構築を開始するには、AWS SAM CLI を使用します。
SAM CLI によりLambdaに似た実行環境が提供され、
アプリケーションの構築、テスト、デバッグをローカルで実行できます。

事前準備:SAM CLIのインストール

Macでのインストール方法をご紹介します。
Homebrewがインストールされていない場合はインストールしてください。
こちらの2つのコマンドでインストールできます。

$ brew tap aws/tap
$ brew install aws-sam-cli

※以下のエラーが出る場合、

Error: 
  homebrew-core is a shallow clone.

その場合、こちらのコマンドを実行します。

$ git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow

※以下のエラーが出る場合、

Error: python@3.8: the bottle needs the Apple Command Line Tools to be installed.
  You can install them, if desired, with:
    xcode-select --install

その場合、こちらのコマンドを実行します。

$ brew install --build-from-source python@3.8
$ xcode-select --install

ステップ1:初期設定

AWS SAMで新しくプロジェクトを始めるには、sam initコマンドを使います。
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 - Multi-step workflow
    3 - Serverless API
    4 - Scheduled task
    5 - Standalone function
    6 - Data processing
    7 - Infrastructure event management
    8 - 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 - dotnet6
    2 - dotnet5.0
    3 - dotnetcore3.1
    4 - go1.x
    5 - graalvm.java11 (provided.al2)
    6 - graalvm.java17 (provided.al2)
    7 - java11
    8 - java8.al2
    9 - java8
    10 - nodejs16.x
    11 - nodejs14.x
    12 - nodejs12.x
    13 - python3.9
    14 - python3.8
    15 - python3.7
    16 - python3.6
    17 - ruby2.7
    18 - rust (provided.al2)
Runtime: 17
What package type would you like to use?
    1 - Zip
    2 - Image
Package type: 2
Based on your selections, the only dependency manager available is bundler.
We will proceed copying the template using bundler.
Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: y
X-Ray will incur an additional cost. View https://aws.amazon.com/xray/pricing/ for more details
Project name [sam-app]: sam-app
Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)
    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Base Image: amazon/ruby2.7-base
    Architectures: x86_64
    Dependency Manager: bundler
    Output Directory: .
    Next steps can be found in the README file at ./sam-app/README.md
    
    Commands you can use next
    =========================
    [*] Create pipeline: cd sam-app && sam pipeline init --bootstrap
    [*] Validate SAM template: sam validate
    [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
  • Which template source would you like to use?
    使用するテンプレートを設定します。「1 - AWS Quick Start Templates」を選択します。
  • Choose an AWS Quick Start application template
    最初の選択で1を選んだ場合にどのテンプレートを使用するか選択できます。
    「1 - Hello World Example」を選択します。
  • Use the most popular runtime and package type? (Python and zip) [y/N]:
    おすすめの設定で、ランタイム:Python、パッケージ:zipで始めることができますが、
    ここでは「N」を入力して、使用するランタイムとパッケージを選択します。
  • Which runtime would you like to use?
    使用するランタイムを選択します。今回はRubyの「17」を選択します。
  • What package type would you like to use?
    サーバーレスアプリケーションのパッケージをZIPかIMAGEから選択できます。
  • Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]:
    AWS X-Rayという分析アプリケーションのトレースを有効にできます。
    料金が発生する場合があるでお好みで設定してください。

aws.amazon.com

  • Project name [sam-app]: sam-app
    プロジェクトの名称を設定します。
    成功すると以下のようなファイルが作成されます。
sam-app
├── Gemfile
├── README.md
├── events
│   └── event.json
├── hello_world
│   ├── Dockerfile
│   ├── Gemfile
│   └── app.rb
├── template.yaml
└── tests
    └── unit
        └── test_handler.rb

ステップ2:ビルド

続いて、ビルドを実行します。 作成されたプロジェクトのフォルダでsam buildコマンドを実行します。

$ cd sam-app
$ sam build

ビルドに成功すると以下のようなファイルが生成されます。

sam-app
├── .aws-sam
   ├── build
   │   └── template.yaml
   └── build.toml

ステップ3:デプロイ

sam deployコマンドでサンプルアプリケーションをデプロイします。

sam deploy --guided
Configuring SAM deploy
======================
    Looking for config file [samconfig.toml] :  Not found
    Setting default arguments for 'sam deploy'
    =========================================
    Stack Name [sam-app]: sam-app
    AWS Region [ap-northeast-1]: 
    #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
    Confirm changes before deploy [y/N]: N
    #SAM needs permission to be able to create roles to connect to the resources in your template
    Allow SAM CLI IAM role creation [Y/n]: Y
    #Preserves the state of previously provisioned resources when an operation fails
    Disable rollback [y/N]: y
    HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
    Save arguments to configuration file [Y/n]: y
    SAM configuration file [samconfig.toml]: 
    SAM configuration environment [default]: 
    Looking for resources needed for deployment:
    Creating the required resources...
    Successfully created!
     Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-XXXXXXXX
     A different default S3 bucket can be set in samconfig.toml
     Image repositories: Not found.
     #Managed repositories will be deleted when their functions are removed from the template and deployed
     Create managed ECR repositories for all functions? [Y/n]: y
  • Stack Name [sam-app]:
    デプロイすると作成されるCloud Formationのスタック名を設定できます。

  • AWS Region [ap-northeast-1]:
    デプロイ先のリージョンを指定します。日本なら「ap-northeast-1」です。

  • Confirm changes before deploy [y/N]:
    実際にデプロイを実行する前に変更を確認するか設定できます。

  • Allow SAM CLI IAM role creation [Y/n]:
    デプロイするときにIAMロールを作成するかを設定します。

  • Disable rollback [y/N]:
    デプロイ中にエラーが発生した場合にロールバックするかどうかを設定します。
    設定するとエラーが発生する前に生成・更新されたリソースはロールバックされなくなります。

  • HelloWorldFunction may not have authorization defined, Is this okay? [y/N]:
    作成されるアプリケーションに認証がないAPI Gateway APIを設定するが問題ないか聞かれます。
    yにすると一般に利用可能(認証が不要)なAPIのURLを作成します。

  • Save arguments to configuration file [Y/n]:
    デプロイの設定を設定ファイルに保存するか設定します。Yにすると設定ファイルが上書きされます。

  • SAM configuration file [samconfig.toml]:
    設定ファイル名を設定します。

  • SAM configuration environment [default]:
    環境名を設定します。デフォルトの環境名は「default」です。

  • Create managed ECR repositories for all functions? [Y/n]:
    パッケージのタイプをIMAGEにしていた場合、コンテナイメージを管理するECRのリポジトリを作成します。

成功すると以下のリソースが作成されます。

Key                 HelloWorldFunctionIamRole                                                                                                                                                                     
Description         Implicit IAM Role created for Hello World function                                                                                                                                            
Value               arn:aws:iam::XXXXXXXX:role/sam-app-HelloWorldFunctionRole-YYYYYYYYYY 

Key                 HelloWorldApi                                                                                                                                                                                 
Description         API Gateway endpoint URL for Prod stage for Hello World function                                                                                                                              
Value               https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/  

Key                 HelloWorldFunction                                                                                                                                                                            
Description         Hello World Lambda Function ARN                                                                                                                                                               
Value               arn:aws:lambda:ap-northeast-1:XXXXXXXX:function:sam-app-HelloWorldFunction-YYYYYYYYYY                                                                                                   

デプロイできたら動作確認します。

curl https://e6h71kw6v0.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

「Hello World!」というメッセージが帰ってくれば成功です。

{"message":"Hello World!"}

まとめ

今回はAWS SAMについてご紹介しました。
私が約4年前に触ったときより機能が増えているだけでなく、
圧倒的に使いやすくなっていることに驚きました。

以前はコマンドのオプションで全て設定しなければいけなかったのですが、
全て対話形式になっており、オプションを逐一調べる必要もなくミスも格段に減らせると思います。
サーバーレスアプリケーションを作成する際はぜひAWS SAMをご検討ください。

P.S.

虎の穴ラボでは、私たちと一緒に新しいオタク向けサービスを作る仲間を募集しています。
詳しい採用情報は以下をご覧ください。
yumenosora.co.jp