皆さんこんにちは!虎の穴ラボの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という分析アプリケーションのトレースを有効にできます。
料金が発生する場合があるでお好みで設定してください。
- 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