AWS ツールキットを使用した AWS サーバーレスアプリケーションの操作 - AWS Cloud9

AWS ツールキットを使用した AWS サーバーレスアプリケーションの操作

AWS は、サーバーレスアプリケーションをサポートします。AWS ツールキットを使用して AWS Lambda 関数を含むサーバーレスアプリケーションを作成し、そのアプリケーションを AWS CloudFormation スタックにデプロイできます。

サーバーレスアプリケーションの作成

この例では、AWS ツールキットを使用してサーバーレスアプリケーションを作成する方法を示します。サーバーレスアプリケーションの実行とデバッグの詳細については、サーバーレスアプリケーションの実行とデバッグ を参照してください。

サーバーレスアプリケーションを作成するために必要な前提条件には、AWS SAMCLIAWSCLI が含まれていますAWS Cloud9。

AWS ツールキットでサーバーレスアプリケーションを作成

この例は、AWS Serverless Application Model(AWS SAM)を使用して、AWS ツールキットでサーバーレスアプリケーションを作成する方法を示します。

  1. AWSExplorer]でLambdaノードを右クリックし、Lambda SAMアプリケーションの作成を選択します。

    注記

    または、[AWS: Explorer]の見出しからメニューアイコンをクリックして、Lambda SAM アプリケーションの作成を選択できます。

  2. SAM アプリケーションのランタイムを選択します。この例では、[nodejs12.x]を選択します。

    注記

    「(イメージ」でランタイムの 1 つを選択した場合、アプリケーションはパッケージタイプ Image です。「(イメージ)」を使わずにランタイムの 1 つを選択した場合、アプリケーションのタイプは Zip です。との違いの詳細については、Image および Zip パッケージタイプのちがいについては、AWS LambdaデベロッパーガイドLambda デプロイパッケージを参照してください。

  3. サーバーレスアプリケーションには、以下のいずれかのテンプレートを選択します。

    • AWS SAMHello World: ベーシックな「Hello World」メッセージを返す Lambda 関数がある基本的なテンプレート。

    • AWSStep Functions Sample App: 株式取引ワークフローを実行するサンプルアプリケーション。ステップ関数は、関与する Lambda 関数の相互作用をオーケストレートします。

  4. 新しいプロジェクトの場所を選択します。既存の WorkSpaces フォルダがある場合は選択するか、別のフォルダを参照できます。別のフォルダを選択を選択すると、イアログボックスが表示され、フォルダの場所の選択が許可されます。

  5. 新しいアプリケーションの名前を入力します。この例では my-sam-app-nodejs を使用します。[入力]を押した後、AWSツールキット でプロジェクトが作成されるまで少し時間がかかります。

プロジェクトが作成されると、[環境] ウィンドウにアプリケーションのファイルを表示できます。[Explorer]ウィンドウに表示されます。


                    SAM アプリケーションで使用可能なランタイムを示すスクリーンショット。

サーバーレスアプリケーションの実行とデバッグ

AWS ツールキットを使用して、サーバーレスアプリケーションをデバッグし、開発環境でローカルで実行する方法を設定します。AWS Serverless Application Model(AWS SAM) テンプレートで定義されているサーバーレスアプリケーションをデバッグできます。このテンプレートは、シンプルな YAML 構文を使用して、サーバーレスアプリケーションを構成する関数、API、データベース、API、データベース、イベントソースのマッピングなどのリソースを記述します。

AWS SAM テンプレートをよく見ると、AWS Serverless Application Modelデベロッパーガイド内のAWS SAM テンプレートの分析を参照してください。

また、SAM テンプレートにコミットされていないサーバーレスアプリケーションを迅速にデバッグすることもできます。

インラインアクションを使用して、適格なAWS Lambda 関数を特定すると、デバッグ動作の設定がスタートします。SAM テンプレートによって定義されたインフラストラクチャを使用するには、関連する YAML 形式のファイルでインラインアクションを使用します。テンプレートなしで関数を直接テストするには、アプリケーションファイルの Lambda ハンドラーのコンテキストに応じたリンクを使用します。

注記

この例では、JavaScript を使用するアプリケーションをデバッグします。しかし、次の言語とランタイムを備えたAWS ツールキット では、デバッグの特徴を使用できます。

  • JavaScript – Node.js 10.x, 12.x, 14.x

  • Python — 3.7、3.8 (Python 2.7 および 3.6 サーバーレスアプリケーションを実行できますが、AWS ツールキットでデバッグできません)。

言語の選択は、コンテキストに応じたリンクが適格な Lambda ハンドラーを示す方法にも影響します。詳細については、「コードからサーバーレス関数を直接実行およびデバッグ」を参照してください。

サーバーレスアプリケーションの実行とデバッグのため、SAM テンプレートを使用

SAM テンプレートを使用して実行およびデバッグされるアプリケーションの場合、YAML 形式のファイルには、アプリケーションの動作と使用するリソースが記述されます。AWS ツールキットを使ってサーバーレスアプリケーションを作成している場合、template.yaml と名付けられたファイルがプロジェクトのため自動的に生成されます。

この手順では、サーバーレスアプリケーションの作成 で作成したサンプルアプリケーションを使用します。

SAM テンプレートを使用してサーバーレスアプリケーションを実行およびデバッグ

  1. サーバーレスアプリケーションを構成するアプリケーションファイルを表示するには、[環境 ]ウィンドウに移動します。

  2. アプリケーションフォルダ (例:my-sample-app) でtemplate.yaml ファイルを開きます。

  3. template.yaml のエディターの上で、ドロップダウンメニューから 起動設定の編集を選択します。

    新しいエディタに表示されるlaunch.jsonファイルは、デフォルト属性があるデバッグ設定を提供します。

  4. 次の設定プロパティの値を編集または確認します。

    • "name" – 読みやすい名前を入力して、[実行]ビューの[設定]ドロップダウンフィールドに表示します。

    • "target" – 値が"template" SAM テンプレートがデバッグセッションのエントリポイントになるように確認します。

    • "templatePath"template.yaml ファイルに相対パスまたは絶対パスを入力。

    • "logicalId" – 名前が SAM テンプレートのリソースセクションで指定されたものに一致するように確認します。この場合はタイプ AWS::Serverless::FunctionHelloWorldFunction です。

    launch.json ファイル内のこれらと他の入力に関する詳細は、「サーバーレスアプリケーションのデバッグ用設定オプション」を参照してください。

  5. デバッグ設定に問題がなければ、launch.json を保存します。次に、デバッグをスタートするため、RUN の横の緑色の[再生]ボタンを選択します。

    注記

    SAM アプリケーションの実行に失敗した場合は、[出力]ウィンドウをチェックして、Docker イメージが構築されていないためにエラーが発生しているかどうかを確認します。環境でディスク容量を解放する必要があります。

    詳細については、「AWS Cloud9 環境に十分なディスク領域がないため、SAM アプリケーションをローカルのAWS ツールキットで実行中のエラー」を参照してください。

    デバッグセッションが開始すると、デバッグコンソールパネルには、デバッグ出力が表示され、Lambda 関数によって返される値が表示されます。(SAM アプリケーションをデバッグする場合、AWS ツールキットがの出力パネル内の出力チャンネルとして選択されています。)。

    注記

    Windows ユーザーの場合、このプロセス中に Docker マウントエラーを見つけた場合は、共有ドライブの認証情報を更新する必要があります (Docker 設定内)。Docker マウントエラーは次のようになります。

    Fetching lambci/lambda:nodejs10.x Docker container image...... 2019-07-12 13:36:58 Mounting C:\Users\<username>\AppData\Local\Temp\ ... as /var/task:ro,delegated inside runtime container Traceback (most recent call last): ...requests.exceptions.HTTPError: 500 Server Error: Internal Server Error ...

コードからサーバーレス関数を直接実行およびデバッグ

AWS SAM アプリケーションをテストする場合、Lambda 関数だけを実行およびデバッグだけを選択し、SAM テンプレートで定義されている他のリソースを除外することができます。このアプローチでは、インラインアクションを使用して、直接呼び出すことができるソースコード内の Lambda 関数ハンドラを識別します。

コンテキスト対応リンクによって検出される Lambda ハンドラーは、アプリケーションで使用している言語とランタイムによって異なります。

言語/ランタイム Lambda 関数がコンテキスト対応リンクによって識別される基準

JavaScript(Node.js 10.x、12.x、14.x)

関数には以下の特徴があります。
  • 最大 3 つのパラメータがあるエクスポートされた関数です。

  • WorkSpaces フォルダー内の親フォルダーにpackage.json ファイルがあります。

Python (3.7 と 3.8)

関数には以下の特徴があります。
  • 上位レベルの関数です。

  • WorkSpace フォルダー内の親フォルダーにrequirements.txt ファイルがあります。

サーバーレスアプリケーションをアプリケーションコードから直接実行およびデバッグ

  1. サーバーレスアプリケーションファイルを表示するには、エディタの横にあるフォルダアイコンを選択して、アプリケーションフォルダに移動します。

  2. アプリケーションフォルダ (my-sample-appなど) から、関数フォルダー (この場合、hello-world) を拡張し、app.js ファイルを開きます。

  3. 適格な Lambda ハンドラー関数を識別するインラインアクションで、Add Debug Configuration を選択します。

    
                            Lambda 関数ハンドラーのインラインアクション内の[デバッグ設定の追加]オプションにアクセスします。
  4. SAM アプリケーションを実行するランタイムを選択します。

  5. launch.json ファイルのエディターでは、次の設定プロパティの値を編集または確認します。

    • "name" – 分かりやすい名前を入力します。

    • "target" – 値が "code" で、Lambda 関数ハンドラを直接呼び出せることを確認します。

    • "lambdaHandler" – 関数を呼び出すために Lambda が呼び出すコード内のメソッドの名前を入力します。たとえば、JavaScript のアプリケーションでは、デフォルトは app.lambdaHandler です。

    • "projectRoot" – Lambda 関数を含むアプリケーションファイルにパスを入力します。

    • "runtime" – Lambda 実行環境の有効なランタイムを入力または確認します。たとえば、"nodejs.12x"

    • "payload" – 以下のいずれかのオプションを選択して、Lambda 関数に入力として提供するイベントペイロードを定義します。

      • "json": イベントペイロードを定義する JSON 形式のキーバリューペア。

      • "path": イベントペイロードとして使用されるファイルへのパス。

  6. デバッグ設定が満足なものであれば、[RUN]の横の緑の再生矢印を選択して、デバッグをスタートします。

    デバッグセッションがスタートすると、デバッグコンソールパネルには、デバッグ出力が表示され、Lambda 関数によって返される値が表示されます。(SAM アプリケーションをデバッグする場合、AWS ツールキット出力パネル内の出力チャンネルとして選択されています)。

    注記

    エラーメッセージに Docker が記載されている場合は、この注記を参照してください。

ローカル Amazon API Gateway リソースの実行とデバッグ

invokeTarget.target=api と共に type=aws-sam の AWS Cloud9 起動設定を実行することによって、template.yaml に指定されているAWS SAM API Gateway のローカルリソースを実行またはデバッグすることができます。

注記

API Gateway は、REST と HTTP の 2 種類の API をサポートしています。ただし、AWS ツールキットがある API Gateway の特徴は、 REST API のみをサポートします。時に、HTTP API は「API Gateway V2 API」と呼ばれます。

ローカル API Gateway リソースを実行およびデバッグ

  1. 以下のいずれかのアプローチを選択し、AWS SAMAPI Gateway リソース用起動 Config を作成:

    • オプション 1: AWS SAM プロジェクトにあるハンドラーのソースコード (.js、.cs、または.py ファイル) にアクセスし、Lambda ハンドラーの上で移動して、デバッグ設定の追加を選択します。次に、メニューで API イベントとマークされた項目を選択します。

    • オプション 2 launch.json を編集して、次の構文を使用して新しい起動設定を作成します。

      { "type": "aws-sam", "request": "direct-invoke", "name": "myConfig", "invokeTarget": { "target": "api", "templatePath": "n12/template.yaml", "logicalId": "HelloWorldFunction" }, "api": { "path": "/hello", "httpMethod": "post", "payload": { "json": {} } }, "sam": {}, "aws": {} }
  2. Run (実行) ]ボタンの横のドロップダウンメニューで、起動設定を選択します (上記の例では myConfig と名付けられています) 。

  3. (オプション) Lambda プロジェクトコードにブレークポイントを追加します。

  4. 緑の「再生」ボタンの横にある[Run (実行)]ボタンを選択します。

  5. 出力ペインで、結果を表示します。

設定

invokeTarget.target プロパティ値 api を使用する時は、ツールキットは起動設定の検証と動作を変更して、apiフィールドをサポートします。

{ "type": "aws-sam", "request": "direct-invoke", "name": "myConfig", "invokeTarget": { "target": "api", "templatePath": "n12/template.yaml", "logicalId": "HelloWorldFunction" }, "api": { "path": "/hello", "httpMethod": "post", "payload": { "json": {} }, "querystring": "abc=def&qrs=tuv", "headers": { "cookie": "name=value; name2=value2; name3=value3" } }, "sam": {}, "aws": {} }

例の値を、次のように置き換えます。

invokeTarget.logicalId

API リソース。

path

起動Configが要求する API パス (例:"path": "/hello")。

invokeTarget.templatePath によって指定される template.yaml から解決された有効な API パスでなければなりません。

httpMethod

「delete (削除)」、「get (取得)」、「head (率いる、ヘッド)」、「option (オプションを与える)」、「patch (パッチ)」、「post (転記、投稿)」、「put (プット、つける)」のいずれかの動詞とすることができます。

payload

リクエストで送信する lambda.payload フィールドと同じ構造とルールを持つ JSON ペイロード (HTTP 本文)。

payload.pathは JSON ペイロードを含むファイルを指します。

payload.jsonは JSON ペイロードをインラインで指定します。

ヘッダー

名前と値のペアのオプションのマップ。以下の例のようにリクエストに含める HTTP ヘッダーを指定するため使用します。

"headers": { "accept-encoding": "deflate, gzip;q=1.0, *;q=0.5", "accept-language": "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5", "cookie": "name=value; name2=value2; name3=value3", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36", }
querystring

リクエストの querystring を設定するオプションの文字列、たとえば "querystring": "abc=def&ghi=jkl"

aws

AWS 接続情報を提供する方法。詳細については、サーバーレスアプリケーションのデバッグ用設定オプションAWS 接続(aws) プロパティ表を参照してください。

SAM

AWS SAM CLIがアプリケーションを構築する方法 詳細については、サーバーレスアプリケーションのデバッグ用設定オプションAWS SAM CLI (「sam」) のプロパティを参照してください。

サーバーレスアプリケーションのデプロイ

この例では、AWS Toolkit for Visual Studio Code を使用して、前のトピック(サーバーレスアプリケーションの作成) で作成したサーバーレスアプリケーションを AWS にデプロイする方法を示します。

前提条件

  • 必ずグローバルに一意な Amazon S3 バケット名を選択してください。

  • 設定した認証情報にAmazon S3、AWS CloudFormation、AWS Lambda、および Amazon API Gateway などのサービスに対する適切な読み取り/書き込みアクセス許可が含まれていることを確認します。

  • デプロイタイプ Image であるアプリケーションの場合、グローバルに一意の Amazon S3 バケット名と、デプロイに使用する Amazon ECR リポジトリ URI の両方があることを確認します。

サーバーレスアプリケーションのデプロイ

  1. AWSExplorer]ウィンドウで、Lambda ノードのコンテキストメニュー (右クリック) を開き、デプロイ SAM アプリケーションを展開を選択します。

  2. デプロイに使用する template.yaml ファイルを選択します。

  3. デプロイ先の AWS リージョンを今すぐ選択します。

  4. このデプロイで使用できる Amazon S3 バケットの名前を入力します。バケットは、デプロイ先の AWS リージョンにある必要があります。

    警告

    Amazon S3 バケット名は、Amazon S3 内のどの既存バケット名とも重複しないグローバルに一意な名前である必要があります。したがって、次の例に示す名前に一意の識別子を追加する必要があります (または、別の名前を選択してください)。

  5. サーバーレスアプリケーションに、パッケージタイプの Image を伴う関数が含まれているのであれば、このデプロイで使用できる Amazon ECR リポジトリの名前を入力します。リポジトリは、デプロイ先のリージョンにある必要があります。

  6. デプロイされたスタックの名前 (新しいスタック名または既存のスタック名) を入力します。

  7. コンソールの[AWSツールキット]タブ上のデプロイの成功を確認します。

    エラーが発生すると、右下にメッセージがポップアップします。

    この場合は、[AWSツールキット]タブのテキストで詳細をチェックします。以下に示しているのは、エラーの詳細の例です。

    Error with child process: Unable to upload artifact HelloWorldFunction referenced by CodeUri parameter of HelloWorldFunction resource. S3 Bucket does not exist. Execute the command to create a new bucket aws s3 mb s3://pbart-my-sam-app-bucket An error occurred while deploying a SAM Application. Check the logs for more information by running the "View AWS Toolkit Logs" command from the Command Palette.

    この例では、Amazon S3 バケットが存在しないためエラーが発生しました。

デプロイが完了したら、アプリケーションが[AWSExplorer]に表示されます。アプリケーションの一部として作成された Lambda 関数の呼び出し方法については、リモートのLambda 関数を呼び出す を参照してください。

AWSクラウドからサーバーレスアプリケーションを削除

サーバーレスアプリケーションを削除すると、AWS クラウドに以前、デプロイした AWS CloudFormation スタックも削除されます。この手順を実行しても、ローカルホストからアプリケーションディレクトリは削除されないことにご注意ください。

  1. AWSExplorer]を開きます。

  2. AWSExplorer]ウィンドウで、削除したいデプロイされたアプリケーションを含むリージョンを展開し、AWS CloudFormationを拡張します。

  3. 削除したいサーバーレスアプリケーションに対応する AWS CloudFormation スタック名のコンテキスト (右クリック) メニューを開き、[Delete CloudFormation Stack (CloudFormation スタックの削除)] を選択します。

  4. 選択したスタックを削除したいことを確認する場合は、[削除 ]を選択します。

スタックの削除が成功すれば、AWS ツールキットは、AWSExplorer 内のAWS CloudFormation リストからスタック名を削除します。