開発者コンソール

手順6: Lambdaパッケージを作成・デプロイする

手順6: Lambdaパッケージを作成・デプロイする

Fire TV対応アプリをアップロードできたので、次はAlexaから受け取ったディレクティブをアプリに渡すことができるLambda関数を作成する必要があります。ここでは、ビデオスキルを実装するための土台として使用できるサンプルLambda関数が用意されています。このサンプルLambda関数は、Alexaから受け取ったディレクティブに応答し、ADM経由でFire TV対応アプリと通信します。

Lambdaについて

この手順では、Lambdaに関する作業を開始します。このドキュメントには、Fire TV対応アプリでVSKを統合する際に使用するLambda関数のサンプルコードが含まれています。このコードには、Discovery、SearchAndPlay、FastForward、ChangeChannelなどのディレクティブに対するレスポンスが含まれています。このindex.jsコードを基にして、独自のロジックを追加することができます。

このLambda関数では、クライアントシークレットとクライアントIDを実際の値で更新する必要があります。Node.jsアプリを使用して、関数をLambdaデプロイパッケージ(zipファイル)として生成し、AWS Lambdaにアップロードします。後ほど、受信ディレクティブを処理してアプリに渡すロジックを記述し、この関数をカスタマイズします。

Lambda関数のロジックをカスタマイズする際は、Node.jsをある程度理解していると役立ちますが、この段階ではNode.jsの専門的な知識は必要ありません(Lambda関数はそのほかのさまざまな言語でコーディングすることもできます)。このサンプルLambda関数では、Node.jsバージョン10以降を使用する必要があります。想定されるAlexaディレクティブをLambda関数で処理する方法の詳細については、Alexaディレクティブを解釈して応答するを参照してください。

サンプルLambda関数のダウンロード

Fire TV対応のサンプルLambda関数は、sample-fire-tv-app-video-skill GitHubリポジトリのLambdaフォルダにあります。このフォルダは、手順2のVSKを統合したFire TV対応サンプルアプリのダウンロードでサンプルアプリをダウンロードしたときに作成されたものです。

このLambdaフォルダには、サンプルLambda関数のindex.jsファイルのほかに、package.jsonファイルが含まれています。後者は、Lambdaコードをデプロイパッケージとして生成するために必要なNodeモジュールのダウンロードに使用するファイルです。このフォルダには、ビデオコンテンツのデータソースの例であるvideo_catalog.jsonも含まれています。

Lambda関数のクライアントIDとクライアントシークレットの更新

まず、Lambda関数のサンプルコードでクライアントIDとクライアントシークレットを更新する必要があります。

  1. Node.jsとnpmのバージョン10以降がインストールされていることを確認します。Node.jsがインストールされているかどうかを確認するには、「node -v」と入力します。npmがインストールされているかどうかを確認するには、「npm -v」と入力します。まだインストールしていない場合は、Node.jsをダウンロードしてインストールしてください(Node.jsのインストールにはnpmが含まれるため、npmを個別にインストールする必要はありません)。
  2. Lambdaフォルダに移動し、テキストエディターでindex.jsを開きます。
  3. アプリに署名してセキュリティプロファイル構成するで取得したCLIENT_IDCLIENT_SECRETの値を入力します。

    32~33行目:

    const CLIENT_ID = '<クライアントIDを入力>';
    const CLIENT_SECRET = '<クライアントシークレットを入力>';
    
  4. ターミナルウィンドウまたはコマンドプロンプトを開き、Lambdaアプリが含まれているディレクトリに移動します。次に例を示します。

    cd /Users/<ユーザー名>/sample-fire-tv-app-video-skill/Lambda
    
  5. 次のコマンドを実行します。

    npm install
    

    node_modulesという名前のフォルダが作成され、そこにすべての依存パッケージが保存されます。package-lock.jsonも追加され、次のような成功メッセージが表示されます。

    added 69 packages from 127 contributors and audited 89 packages in 5.483s
    found 0 vulnerabilities
    

Lambdaデプロイパッケージの作成

Lambda関数をカスタマイズし、Node.jsモジュールをインストールしたら、次の手順に従ってLambdaデプロイパッケージを生成します。

  1. Lambdaコードindex.jsが含まれているディレクトリに移動します。
  2. 次のコマンドを実行して、Lambdaデプロイパッケージを作成します。

    zip -r firetv-lambda.zip .
    

    これにより、すべてのLambdaコードをパッケージ化したzipファイルが作成されます(Windowsの場合は、Windowsエクスプローラーでフォルダを右クリックし、[送る] > [圧縮(zip形式)フォルダー] を選択して作成することもできます)。

    これで、このディレクトリにfiretv-lambda.zipというパッケージが作成されました。このパッケージは、以降のセクションで(IAMロールの作成後に)AWS Lambdaにアップロードします。

Lambda用IAMロールの作成

まず、Lambda関数を呼び出せるアプリを指定するためのアクセス権限を定義する必要があります。ここでは、Lambda関数がCloudWatchなどのAWSサービスを呼び出すことを許可するIAMロールを作成します。以下の手順に従って、IAMロールを作成します。

  1. AWSマネジメントコンソールにサインインします(以前と同じAmazon開発者アカウントを使用する必要はありません)。
  2. 上部ナビゲーションバーの [サービス] をクリックし、「IAM」を検索します。検索結果に表示される [IAM] をクリックしてください。
  3. 左側のナビゲーションから [ロール] を選択し、[ロールの作成] ボタンをクリックします。
  4. [AWSサービス] ボックス(デフォルトで選択済み)の下にある [Lambda] をクリックし、下部の [次のステップ: アクセス権限] ボタンをクリックします。
  5. AWSLambdaBasicExecutionRole」を検索し、その横にあるチェックボックスをオンにします。次に、[次のステップ: タグ] ボタンをクリックします。
  6. 「タグの追加(オプション)」構成をスキップし、[次のステップ: 確認] ボタンをクリックします。
  7. ロール名を入力して(「video_skill_streamz」など)、必要に応じて説明を入力し、[ロールの作成] ボタンをクリックします。

    Lambdaとやり取り可能なIAMロールの作成
    Lambdaとやり取り可能なIAMロールの作成

    IAMロール名を記録して、以下の手順ですぐに使用できるようにしてください(特にAWSで複数のIAMロールを作成済みの場合)。

ビデオスキルのLambda関数をAWSで作成する方法

次に、ビデオスキルで使用するLambda関数をAWSで作成します。以下の手順に従って、ビデオスキルのLambda関数を作成します。

  1. AWSマネジメントコンソールにログインします。
  2. [サービス] をクリックし、[Lambda] に移動します(検索ボックスを使用)。
  3. 以下の表に基づいて、画面右上のドロップダウンリストから適切なAWSリージョンを選択します (IAMとは異なり、Lambda関数はAWSリージョンに固有です)。

    ロケール ユーザーのリージョン AWSリージョン
    en-US、en-CA、fr-CA、pt-BR、es-MX 北米 米国東部(バージニア北部)
    en-GB、fr-FR、de-DE、it-IT、es-ES、en-IN、hi-IN 欧州 欧州(アイルランド)
    ja-JP、en-AU 極東(FE) 米国西部(オレゴン)

    (ロケールの省略形では、小文字は言語を示し、大文字は地域を示します。たとえば、「fr-CA」はカナダのフランス語圏を意味し、「en-CA」はカナダの英語圏を意味します。)

    ユーザーの居住地に近いリージョンを選択すると、発話からLambda呼び出しまでのレイテンシを最小限に抑えることができます。また、間違ったAWSリージョンを選択すると、ビデオスキルが機能しなくなります。

    AWSリージョンの選択
    AWSリージョンの選択
  4. [関数の作成] ボタンをクリックします。
  5. [一から作成] ボックスを選択した状態で、以下のように設定します。
    • [関数名]: 一意の名前にします(例:firetv_app_lambda)。
    • [ランタイム][Node.js 10.x](Lambda関数のサンプルコードはNode.jsで記述されています。本番ではPython、Ruby、.NET、Javaなどの言語も使用可能です)。
    • [アクセス権限][実行ロールの選択または作成] をクリックして、このセクションを展開します。次のように設定します。
      • [実行ロール][既存のロールを使用する]
      • [既存のロール]: 前のセクション(Lambda用IAMロールの作成)で作成したIAMロールを選択します。
      AWSでの基本的なLambda関数の作成
      AWSでの基本的なLambda関数の作成
  6. [関数の作成] ボタンをクリックします。

    Lambda関数が作成されます。Lambda関数がAlexaからディレクティブを受信するためには、メッセージの取得場所を通知するスマートホーム用トリガーを追加する必要があります(このトリガーとして、デバイス(Echo Dotなど)とクラウドのLambdaコンピューティングをつなげる役目を果たすのが、スマートホームAPIです)。

  7. [+トリガーを追加] ボタンをクリックします。
  8. [トリガーの設定][Alexa Smart Home] を選択し、手順1: ビデオスキルを作成してデバイスをセットアップするで作成したビデオスキルIDを [アプリケーションID] フィールドに入力します。次に、[追加] ボタンをクリックします。

    ビデオスキルIDを使用したLambdaの構成
    ビデオスキルIDを使用したLambdaの構成

    [追加] をクリックすると、上部に「トリガー<123456789...>が関数<Lambda関数名>に正常に追加されました。関数は現在、トリガーからのイベントを受信しています」という成功の通知が表示されます。 この場合、Lambda関数のトリガーはビデオスキルです。ビデオスキルによって、このLambda関数が呼び出されます。

  9. 以下のスクリーンショットが示すように、Lambda関数のARNが画面右上に表示されるので、コピーして記録します。この情報は、この後の手順でビデオスキルを更新するときに必要になります。

    Lambda関数用ARNの表示場所
    Lambda関数用ARNの表示場所
  10. ページ中央に表示されるLambda関数の名前(Lambdaアイコンがあるボックス)をクリックします。下のペインに [関数コード] セクションが表示されます。
  11. [関数コード] セクションで、[コードエントリタイプ] メニューをクリックし、[.zipファイルをアップロード] を選択します。
  12. [アップロード] をクリックし、Node.jsで既に作成したfiretv-lambda.zipファイル(Lambdaデプロイパッケージの作成を参照)を選択します。
  13. [保存] をクリックします。[保存] をクリックすると、zipファイルがアップロードされます。

Lambda関数の詳細

Alexaはユーザーの発話(例:『インターステラー』を再生して)をリッスンし、そのリクエストをJSON形式のディレクティブとしてパッケージ化する、ということを覚えておいてください。Lambda関数は、Alexaから送信されたディレクティブを受信してアクションを実行します。Lambda関数は、ディレクティブのメッセージヘッダーにある名前空間と名前の値によって、リクエストの種類を判断します。たとえば、名前空間はリクエストがDiscoverディレクティブであるか、またはChangeChannelディレクティブであるかを指定するので、これに応じてhandleDiscovery関数またはhandleChannelControl関数が呼び出されます。

サンプルLambda関数は、ディレクティブの基本的な処理を提供します。Lambda関数のコードをカスタマイズするには、スキルに対するあらゆる種類のユーザーリクエストを処理し、アプリによる適切なレスポンスをAmazon Device Messaging(ADM)経由で提供する必要があります。チュートリアルの後半では、ビデオスキルでさまざまなディレクティブを処理する方法をテストします。

次のステップ

次の 手順7: Fire TVスキルのセクションを更新するに進みます。

問題が発生して続行できない場合は、クラウド側の統合に関するトラブルシューティングを参照してください。