Amazon Web Services ブログ
AWS CloudFormation と AWS SAM を使用したサーバーレスアプリケーションの開発とデプロイ
お客様は、それぞれの市場で競争力を維持するために、常にイノベーションを求めています。これを達成するための1つの方法は、サービスとアプリケーションを迅速かつ効率よく構築し、それによってコストを削減しながら市場投入までの時間を短縮することです。より具体的には、アプリケーション全体をゼロから構築するよりも、サーバーレスや AI/ML などのクラウドネイティブな機能を活用して管理コストを削減したり、目的別に作られたサービスを組み合わせたり、すでに構築済みのアプリケーションを再利用したりすることが有効です。
このブログ記事では、AWS Serverless Application Model (AWS SAM) と AWS CloudFormation を使用して、サーバーレスアプリケーションをビルドしてデプロイする方法を説明します。また、AWS Serverless Application Repository を使用して既存のアプリケーションを再利用し、開発時間を短縮します。
このブログ記事で紹介されているデモアプリケーションは、Amazon Rekognition を使用して、Amazon Simple Storage Service (Amazon S3) バケットに格納した画像ファイルから機械学習を使用した有名人の分析を実行します。Amazon Rekognition は、エンターテイメント、メディア、スポーツ、ビジネス、政治などのカテゴリの有名人を画像や動画から認識できます。
デモアプリケーションの概要
アプリケーションは、ユーザーが有名人の画像ファイルをドラッグアンドドロップできるウェブページを提供します。画像ファイルは Amazon Rekognition によって分析され、検出された有名人の名前が Amazon CloudWatch Logs に書き込まれます。
デモアプリケーションのアーキテクチャ
このアプリケーションのユースケースは、有名人の画像認識です。2 つのアプリケーションを組み合わせて、必要な機能を提供します。開発する必要があるコンポーネントは画像認識アプリケーションだけです。これを AWS Lambda 関数を使用して実装します。次に、別の開発者が AWS Serverless Application Repository に公開しているアップローダーアプリケーションを取り込みます。このアプリケーションは一般に公開されており、S3 バケットに画像ファイルをアップロードする重要な機能を提供します。
まず、アプリケーションの機能を分解してみましょう。個別の機能は、自己完結型コンポーネントまたはマイクロサービスと呼ばれ、これらを結合してサーバーレスアプリケーションを構成します。デモアプリケーションが実行する主なステップは次のとおりです。
- S3 バケットに画像ファイルをアップロードする
- 画像を処理する
- 結果(有名人の名前)を出力する
これらの機能をすべて実装してアプリケーションに組み込むこともできますが、時間がかかります。それはこのアプリケーションの顧客にとって、コストが高くなり、市場投入までの時間が長くなることを意味します。このため、S3 バケットへの画像ファイルのアップロードなど、一般的な機能を実行する既存のアプリケーションを使用したいと考えています。解決策は AWS Serverless Application Repository です。これは、サーバーレスアプリケーションのためのマネージドリポジトリです。このリポジトリは、チーム、組織、または個人の開発者が再利用可能なアプリケーションの保存と共有を行い、サーバーレスアーキテクチャを簡単に組み立ててデプロイする強力で新しい方法を提供します。
アーキテクチャ図
次の図は、画像認識アプリケーションのアーキテクチャを示しています。

図 2: アプリケーションには、AWS Serverless Application Repository から提供されるアップローダーアプリケーションと、今回開発する画像認識アプリケーションが含まれています
前提条件
このデモアプリケーションを実装するには、次のものが必要です。
- AWS アカウント
- AWS コマンドラインインターフェイス (AWS CLI)。この記事は AWS CLI v2.2.13 を使用しています
- AWS SAM CLI 。この記事では AWS SAM CLI v1.24.1 を使用しています
- AWS CloudFormation Linter (cfn-lint)。この記事では cfn-lint v0.49.2 を使用しています
- Python 3.8 (
sam build
使用時) または Docker (sam build --use-container
使用時)
実装
プロジェクトを作成する
次のコマンドを実行してプロジェクトを作成します。
次のコマンドを実行して、プロジェクトが正常に作成されたことを確認します。tree
コマンドがインストールされていない環境の場合は、ファイルエクスプローラを使用してフォルダ構造をご確認ください。
プロジェクトはサンプルの Hello World アプリケーションを含んだ状態で作成されるため、app.py
および template.yaml
ファイルを編集して、このユースケースのコンテンツを追加する必要があります。これが、次のセクションで行うことになります。今回は events
, hello_world
および tests
ディレクトリ配下のファイルは使用しません。これらを削除したあと、 imganalyzer
というディレクトリを画像認識アプリケーションのために作成します。
サンプルプログラムの中身に興味がある方は、別のディレクトリで sam init
を実行して確認してみてください。
Serverless Application Repository を検索する
AWS Serverless Application Repository でアプリケーションを検索し、その設定を template.yaml
ファイルに埋め込みます。
まず、AWS マネジメントコンソールで AWS Serverless Application Repository を検索して開きます。
次に、[利用可能なアプリケーション] をクリックします。
[パブリックアプリケーション] のタブで uploader を検索し、表示されたアプリケーションをクリックします (図 3) 。
詳細ページで [SAM リソースとしてコピーする] をクリックします。
AWS SAM テンプレートを作成する
AWS Serverless Application Repository のアプリケーションを利用する
template.yaml
ファイルを編集します。sam init
コマンドによってサンプルの内容が生成されていますが、最初の2行を残してすべて削除し、Resources:
セクションを追加します。そこに図4でコピーした SAM リソースを貼り付けます(uploader:
以下の部分になります)。この時点で、コード全体は以下のようになります。
では、このテンプレートの内容を詳しく見ていきましょう。
最初の2行は、 CloudFormation テンプレートのフォーマットバージョンと、 Transform を定義しています。Transform とは、CloudFormation がテンプレートの処理に用いるマクロです。この AWS::Serverless
Transform は、AWS SAM テンプレート構文で書かれたテンプレート全体を CloudFormation テンプレートに変換することを宣言しています。
Resources
セクションは、CloudFormation のメインとなる部分です。ここで実際に構築したい AWS リソースを宣言していきます。最初のリソースとして uploader
アプリケーション、すなわち図 4 でコピーした SAM リソースの内容が貼り付けられています。このリソースは AWS::Serverless::Application
型として宣言され、AWS Serverless Application Repository でホストされているアプリケーションであることを示しています。これはネストされた CloudFormation スタックを作成します。なお、SAM テンプレート内にネストされたサーバーレスアプリケーションを定義する方法については、AWS Serverless Application Model (AWS SAM) 開発者ガイドの AWS::Serverless::Application を参照してください。Location
を見ると、アプリケーションのIDとバージョンを確認することができます。 Parameters
配下の destBucket
は、AWS Serverless Application Repository からコピーしてきた段階では YOUR_VALUE
というプレースホルダになっています。この後の手順で S3 バケットへの参照に置き換えます。
新しい AWS Lambda 関数と Amazon S3 バケットを追加する
画像認識のための imganalyzer
という AWS Lambda 関数と、画像ファイルをアップロードする S3 バケットを Resources
セクションに追加します。※インデントにご注意ください。
では、ここで追加した部分を詳しく見ていきましょう。
imganalyzer
という名前で AWS::Serverless::Function
型のリソースを宣言しています。これは AWS Lambda 関数 を作成します。 Properties
の下には、Lambda ハンドラーを含むプロパティの指定が続きます。
Handler
… 実行の開始時にコード内のどの関数が呼び出されるか。ここでは app.py ファイルのlambda_handler関数を指定Runtime
… どのランタイムを使用するか。ここではPython 3.8
を指定CodeURI
… コードの場所。ここでは、AWS CloudFormation または AWS SAM にカレントディレクトリ配下のimganalyzer
ディレクトリでコードを見つけるように指示
詳細については、『AWS Serverless Application Model 開発者ガイド』の AWS SAM リソースおよびプロパティのリファレンス を参照してください。
ここでは、 imganalyzer
関数の説明と、メモリサイズ、タイムアウト秒数を指定しています。
ここでは、 imganalyzer
関数に与える IAM ロールの権限を定義しています。この関数は Amazon Rekognition を呼び出して有名人を識別するためにマネージドポリシー AmazonRekognitionReadOnlyAccess
を必要とします。また、アップロードされた画像ファイルを Amazon S3 から取得するために、特定の S3 バケットへの読み取り権限が必要です。ここでは、 AWS SAM ポリシーテンプレート を使用して、IAMポリシーの定義を簡単にしています。なお、ここで BucketName: !Ref Bucket1
と定義していないのは、循環参照を避けるためです。詳細は『AWS CloudFormation の AWS SAM テンプレートを使用した循環依存関係の解決』をご参照ください。
目標は、画像ファイルが S3 バケットにアップロードされるたびに、imganalyzer
Lambda 関数をトリガーすることでした。この Events
プロパティは、この Lambda 関数をトリガーするイベントを指定しています。イベントは、型とタイプに依存する一連のプロパティで構成されます。詳細については、『AWS Serverless Application Model 開発者ガイド』の EventSource を参照してください。
SAM テンプレート構造の詳細については、『AWS Serverless Application Model 開発者ガイド』の AWS SAM テンプレートの構造 を参照してください。
最後に、 AWS::S3::Bucket
リソースを追加しています。これは、AWS CloudFormation または AWS SAM に Bucket1
という論理名の S3 バケットを作成するように指示します。S3 バケットの名前は BucketName
プロパティで指定されており、これは実際には celebrityrekognition-ap-northeast-1-123456789012
のような値に置換されます。
uploader 関数に S3 バケットへの参照を設定する
テンプレートで定義した S3 バケットを参照するように uploader
関数のパラメータで YOUR_VALUE
というプレースホルダになっている箇所を置き換えます。
最終的に、template.yaml
は次のようになります。
AWS Lambda 関数の実装
S3 バケットにアップロードされた画像ファイルで有名人の識別を実行するには、imganalyzer
Lambda 関数を実装する必要があります。 imganalyzer
ディレクトリの中に app.py
ファイルを作成し、次のコードを貼り付けます。
このコードは、Amazon Rekognition の RecognizeCelebrities API を呼び出します。このAPIは、画像を分析し、識別された有名人の名前と、一致の信頼度などのその他のパラメータを含む有名人オブジェクトを返します。
次に、空の imganalyzer/requirements.txt
ファイルを作成します。
この時点で、ディレクトリは次のような構造になっています。
アプリケーションをビルドしてデプロイする
デプロイを始める前に、コマンドを実行して、AWS CloudFormation Linter (cfn-lint) を使用してテンプレートを検証してみましょう。問題が見つからなかった場合、コマンドは何も出力しません。
問題がなければ、次のコマンドを実行してアプリケーションのビルドを開始します。
ローカルマシンの環境変数
PATH
にpython3.8
が存在しない場合、ビルドに失敗します。この場合、Python 3.8 をインストールするか、Dockerを使用することでビルド可能です。Dockerを使用する場合は以下のコマンドを実行してください。
次の出力が表示されるはずです。
テンプレートと Lambda 関数の準備ができたので、次の AWS SAM CLI コマンドを使用して AWS SAM テンプレートを AWS アカウントにデプロイし、アプリケーションに必要なリソースを作成します。コマンドはインタラクティブな入力を要求します。以下のように指定します。デプロイ先のリージョンは任意です。
SAM CLI の古いバージョンでは、
sam package
コマンドまたはaws cloudformation package
コマンドを実行する前に、パッケージングされた AWS CloudFormation テンプレートを格納するための S3 バケットを作成する必要があります。SAM CLI の最新バージョンでは、この手順は不要になっています。sam deploy
コマンドは、パッケージング用の S3 バケットが存在しない場合は自動的に作成します。
おめでとうございます!デプロイに成功しました。AWS アカウントにサインインし、パッケージが正常にデプロイされたことを確認します。次に、AWS CloudFormation コンソールを開き、celebityrekognition
スタックのイベントを確認します。次に示すように、CREATE_COMPLETE
と表示されているはずです。
図 6 は、アップローダーアプリケーションのネストされたスタックが sam deploy
コマンドによって作成されたことを示しています。
これで、有名人の画像を認識するためのアプリケーションが作成されました。これには、メインのアプリケーションである画像認識 Lambda 関数が含まれます。次に、AWS Serverless Application Repository からダウンロードした別のアプリケーションであるアップローダーをネストしました。アップローダーアプリケーションは API エンドポイントを作成します。API エンドポイントは、S3 に画像ファイルをアップロードするためのフロントエンドアプリケーションを提供します。
アプリケーションのテスト
AWS Lambda コンソール に移動し、左側のナビゲーションペインから [アプリケーション] を選択します。
アップローダーアプリケーションのリンクを選択します。 “Serverless web application for uploading files to S3” という説明がついています。
詳細ページで、API エンドポイント URL を選択します。
画像ファイルをアップロードするには、オレンジ色の円の中にファイルをドラッグアンドドロップします。サンプルとして、こちらのファイル ( img1, img2 )を使用可能です。
図 9 では、2 つの画像ファイル (img1.png と img2.png) がアップロードされたことがわかります。
AWS Lambda コンソールに移動し、Lambda 関数を選択します ( celebrityrekognition-imganalyzer-1xqhvjc5rjdkp
のような名前です)。
次に、[モニタリング] タブで、[CloudWatch のログを表示] を選択します。
対応するログストリームを選択して、画像認識結果のログを表示します。
img1, img2 の有名人は、それぞれ Jeff Bezos と Andy Jassy (AmazonのCEO) でした。
クリーンアップ
AWS アカウントでの継続的な請求を回避するには、作成したリソースを削除します。
- Amazon S3 コンソールに移動します
- 作成された S3 バケット (
celebrityrekognition-ap-northeast-1-123456789012
のような名前) を選択します - [空にする] をクリックし、 テキストボックスに
完全に削除
と入力後、 [空にする] をクリックします - AWS CloudFormation コンソールに移動します
- 作成したスタックを選択します
- AWS CloudFormation パッケージによってデプロイされたすべてのリソースを削除するには、[削除] を選択します
まとめ
このブログ記事では、AWS Serverless Application Model (AWS SAM) と AWS CloudFormation を使用してサーバーレスアプリケーションを構築する方法を紹介しました。その中で、 AWS Serverless Application Repository で既存のサーバーレスアプリケーションを使用しました。これにより、開発時間とコストが削減されます。サーバーレスアプリケーションは、S3 バケットに保存されている画像ファイルから有名人を認識します。AWS SAM と AWS Serverless Application Repositoryのパワーのおかげで、アップローダーを SAM テンプレートにネストするだけでした。次に、AWS CloudFormation を使用してデモアプリケーションをデプロイしました。
要約すると、このブログでは、AWS クラウドのパワーと、既存のビルディングブロックを活用してクラウドネイティブアプリケーションを構築することで、AWS クラウドでのイノベーションをお客様にどのように役立つかについて説明しました。これにより、最終的に市場投入までの時間を短縮し、コストを削減できます。
この記事は Georges Leschener による “Building and deploying a serverless app using AWS Serverless Application Model and AWS CloudFormation” を翻訳したものです。
翻訳は Solutions Architect の高野 賢司が担当しました。