第一開発事業部の染谷と申します!
新卒で入社したのち、第一開発事業部に配属された後の研修としてアプリケーションの開発の課題を行いました。
約40日間で画像投稿アプリケーションの開発を行うというもので、AWS SAMを利用したサーバレス開発に挑戦しました。
今回初めてアプリケーションの開発を行い、AWS SAMにも初めて触れたので、勉強になることがたくさんありました。
そこでこの記事ではSAMを使った開発の流れや、実際に開発を行ってみて感じたメリットなどを紹介したいと思います。
課題の概要
今回の課題では画像投稿アプリケーションを作成しました。
以下の画像は投稿した画像の一覧画面です。S3に保存した画像を取得するAPIを実装し、一覧表示させています。
詳細画面では、画像に加えて画像に関するコメントや撮影地などの情報をRDSから取得し表示させました。
この画面から情報の編集や画像の削除を行うこともできます。
また画像に関する機能以外にもAmazon Cognitoを利用したログイン機能も備えています。
開発経験は0、入社時の全体研修でちょっとやったくらい
という状態の私にとって、このアプリケーションを完成させたことはかなりの達成感をもたらしてくれました。
AWS SAM
このアプリケーションの開発に利用したAWS SAMですが、一体どのようなサービスなのでしょうか。
そもそもAWS SAMとは
AWS Serverless Application Model
の略です。
公式ドキュメントでは以下のように定義されています。
(日本語のページの機械訳は少し不自然に感じられたため、英語の記述をChatGPTに日本語訳してもらいました。)
AWS Serverless Application Model(AWS SAM)は、インフラストラクチャをコードとして管理する(IaC)ためのオープンソースフレームワークであり、サーバーレスアプリケーションを構築するために使用されます。
AWS SAM のショートハンド構文を使用すると、開発者は AWS CloudFormation リソースや特化したサーバーレスリソースを宣言でき、これらはデプロイ時にインフラストラクチャに変換されます。このフレームワークには、主に2つのコンポーネントが含まれています:AWS SAM CLI と AWS SAM プロジェクトです。
AWS SAM プロジェクトは、sam init コマンドを実行すると作成されるアプリケーションプロジェクトのディレクトリで、AWS SAM テンプレートなどのファイルが含まれています。このテンプレートには、リソースを宣言するためのショートハンド構文が含まれています。
AWS SAMの2つの主要な要素としてAWS SAM CLI と AWS SAM プロジェクトが挙げられています。
AWS SAM CLIはテンプレートを基にアプリケーションを実行するためのコマンドラインツールです。
AWS SAMプロジェクトに含まれているAWS SAMテンプレートではLambda関数やイベント、API Gatewayなどの定義を行うことができます。
今回の課題でもこの2つを利用してアプリケーションの開発を行いました。
AWS SAMを使った開発の始め方
AWS SAM CLIのインストール
まずはAWS SAM CLIをインストールします。
開発者ガイドを参考にインストールすることができます。
sam initコマンドの実行
AWS SAM CLIがインストールできたら、sam init
コマンドを実行します。
sam init
先ほど紹介した公式の説明にも出てきた、 AWS SAM プロジェクトを作成するためのコマンドです。
このコマンドを実行すると、対話型でアプリケーションの初期設定を行うことができます。
テンプレート選択
AWS クイックスタートテンプレートを使うか、カスタムテンプレートを使うか聞かれます。独自のテンプレートを使いたい場合にはカスタムテンプレートを選択します。
今回はAWS クイックスタートテンプレートを使うため「1」を選択しました。
Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1
続いてどのテンプレートを使いたいのか聞かれます。今回はHello World Exampleを使用しました。
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
これ以降は追加設定に関してこの設定有効にする?と聞かれるので必要に応じてy(yes) / n(no)で答えていきます。
プロジェクト名の設定
最後まで設定を終えるとプロジェクトの名前を聞かれるので任意の名前を設定しましょう。
Project name [sam-app]: sam_test
このように表示されたら完了です!
----------------------- Generating application: ----------------------- Name: sam_test Runtime: python3.9 Architectures: x86_64 Dependency Manager: pip Application Template: hello-world Output Directory: . Configuration file: sam_test/samconfig.toml Next steps can be found in the README file at sam_test/README.md
ここまで完了すると、sam_testというプロジェクトディレクトリが作成され、その中にtemplate.yamlが含まれています(以下13行目)。これがAWS SAMテンプレートファイルです。
. ├── main.py └── sam_test ├── README.md ├── __init__.py ├── events │ └── event.json ├── hello_world │ ├── __init__.py │ ├── app.py │ └── requirements.txt ├── samconfig.toml ├── template.yaml └── tests ├── __init__.py ├── integration │ ├── __init__.py │ └── test_api_gateway.py ├── requirements.txt └── unit ├── __init__.py └── test_handler.py
AWS SAMテンプレート
AWS SAMテンプレートには、アプリケーションの設定を記述します。
構造については公式ドキュメントで紹介されています。
今回の課題ではAPI Gatewayの設定を行いました。
Resourcesセクションの中でAPI Gatewayに関する設定を記述しています。
1
Resources: # API Gatewayの設定 PhotoApi: Type: AWS::Serverless::Api Properties: Name: sample-api-gateway Auth: # CognitoAuthorizerの設定 DefaultAuthorizer: SampleAuthorizer Authorizers: SampleAuthorizer: # CognitoUserPoolのリソース名を取得:どのUserPoolを使うか UserPoolArn: {YourUserPoolArn}
2
PhotoList: Type: AWS::Serverless::Function Properties: FunctionName: photo-list CodeUri: functions/ Handler: photo-list.lambda_handler Runtime: python3.12 Architectures: - x86_64 Events: ApiEvent: Type: Api Properties: RestApiId: !Ref PhotoApi Path: /photos Method: get
まず1でAPI Gatewayの設定を行なっています。今回はCognito Authorizerを用いてAPI Gatewayへのアクセスを制御を追加しました。
テンプレート内(12行目〜)に記載されているCoginito Userプールとは、「ウェブおよびモバイルアプリケーションの認証と認可のためのユーザーディレクトリ」です(公式ドキュメントより)。
今回のアプリケーションではAmazon Cognitoを使ってログイン機能を作成しているため、この設定によってログインしているユーザーでないとこのAPI Gatewayにアクセスすることができないようになっています。
2では呼び出されるLambda関数の設定を行なっています。例に挙げたのは画像の一覧を取得する関数です。呼び出しのイベントとしてAPIを指定しました。
この中でRestApiId: !Ref PhotoApi
(15行目)と記述することで、この関数を呼び出すには1で設定したAPI Gatewayを通過することになります。
一部省略している箇所もありますが、今回はこのように記述することでAPIの設定を行いました。
またこの他にもSAMテンプレートでは接続するデータベースのエンドポイントや、Lambda関数のタイムアウト時間の設定なども行うことができます。
AWS SAMを使った開発を通して
これまでAWS SAMを使った開発の始め方やテンプレートファイルの中身を見てきましたが、今回実際に開発を行ってみて感じたメリットを2点ご紹介します
1. コンソールを開かなくてもLambdaやAPI Gatewayの設定を行うことができる
こちらはAWS SAMテンプレートによる利点です。テンプレートにAPIの設定や、今回の場合だと使いたいCognito情報を記載するだけで設定が可能です。当然書き方にルールがあったり、必要な設定項目を精査したりする必要はありますが、そこさえ間違わなければこれだけでAPIの設定ができるのは便利だなと感じました。
2. ローカルでLambdaのテストを行うことができる
今回は触れていませんが、SAM CLIコマンドを使って、ローカルエンドポイントを立ててローカルでテストとデバッグを行うことができます。
いちいちAWS環境にデプロイしなくてもLambdaのテストを行うことができたので、トライアンドエラーを繰り返すことができました。
私はLambdaの記述でエラーを連発したので本当に何度となくエンドポイントを立ち上げることになりましたが、すぐにテストとデバッグができるという特徴に大いに助けられました。
この2点のメリットから意外と初心者にも扱いやすいサービスなのではないかと感じました。
最後に
今回の開発でAWS SAMを使った流れを一通り経験して、基本的な部分は理解することができました。
また今回「公式ドキュメントを確認することは大事」という教訓も得ました。
この記事でもいくつか公式ドキュメントを引用したりリンクを貼ったりしましたが、今回の場合で言うとテンプレートの記述の仕方で迷った時などの答えは大抵公式にありました。
この課題ではAPI Gatewayを介したLambda関数のAPI化のみを行いましたが、調べてみると他にも様々な活用方法があり、今回経験したのはほんの一部なので今後は今回やっていない方法についても触れてみたいと思います!