Alexa-hostedスキルで個人のAWSリソースを使用する



Alexa-hostedスキルで個人のAWSリソースを使用する

Alexa-hostedスキルを作成すると、AlexaはコードとリソースをAWSに保存します。Alexa-hostedスキルの詳細については、Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成するを参照してください。

Alexa-hostedスキルを作成すると、3つのAWS Lambdaエンドポイント、メディアストレージ用のAmazon S3バケット、Amazon S3を使用したセッション永続性管理用のキー値テーブルにアクセスできます。そのほかのAWSサービスを利用する必要がある場合やAWS無料利用枠を超えた場合、追加のリソースのプロビジョニングには独自のAWSアカウントが必要です。

AWS Lambda実行ロールARNを使用すれば、個人のAWSアカウントのリソースをシームレスに使用して、Alexa-hostedスキルの機能を拡張することができます。たとえば、Alexa-hostedスキルをAmazon DynamoDBテーブルに接続できます。

権限の設定

Alexa-hostedスキルで個人のAWSアカウントのリソースを使用するには、Alexa-hostedスキルがアクセスするリソースへのアクセスを許可するようにAWS IAMロールを変更します。

AlexaスキルのARNを取得するには

  1. Alexa開発者コンソールを開いて、ログインします。
  2. コンソールでAlexa-hostedスキルを開きます。
  3. コードエディタの左上のAWS Lambda実行ロールARNのアイコンをクリックします。
  4. ARNをコピーします。

AWS IAMロールを変更するには

  1. AWSマネジメントコンソールを開き、ログインします。
  2. コンソールでIdentity and Access Management(IAM)ダッシュボードを開きます。
  3. IAMダッシュボードでロールをクリックします。
  4. 編集するロールの名前をクリックし、信頼関係タブをクリックします。
  5. 信頼関係の編集をクリックします。
  6. 次のように、Alexa-hostedスキルのAWS Lambda実行ロールARNのポリシーをStatementプロパティに追加し、sts:AssumeRoleアクションを含めます。既存の他のポリシーは上書きしないでください。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          他の ポリシー はこちら
        },
        {
          "Effect": "Allow",
          "Principal": {"AWS": "<Alexa-hostedスキルのAWS Lambda実行ロールARNで置換>"},
          "Action": "sts:AssumeRole"
        }
      ]
    }
    

Node.jsで個人のAWSリソースを使用する

Alexa-hostedスキルのコードで、ロールがAWS Security Token Service (STS)を使用するとします。たとえば、次のコードは、AWS DynamoDBアクセス権限のあるロールの一時認証情報をリクエストし、DynamoDBテーブルをスキャンします。


const AWS = require(aws-sdk);

const ShowUserMessageHandler = {
    //...インテントのcanHandle関数 ...

    async handle(handlerInput) {
        // 1.AWSリソースロールは、STS AssumeRoleアクションを使用するとします
        const STS = new AWS.STS({ apiVersion: '2011-06-15' });
        const credentials = await STS.assumeRole({
            RoleArn: '<AWSリソースロールのARN>',
            RoleSessionName: 'ExampleSkillRoleSession' //任意の名前に変更できます
        }, (err, res) => {
            if (err) {
                console.log('AssumeRole FAILED: ', err);
                throw new Error('Error while assuming role');
            }
            return res;
        }).promise();

        // 2.想定するロール認証情報を使用して、DynamoDBを作成し、
        //    DynamoDBテーブルをスキャンします
        const dynamoDB = new AWS.DynamoDB({
            apiVersion: '2012-08-10',
            accessKeyId: credentials.Credentials.AccessKeyId,
            secretAccessKey: credentials.Credentials.SecretAccessKey,
            sessionToken: credentials.Credentials.SessionToken
        });
        const tableData = await dynamoDB.scan({ TableName: 'TestTable' }, (err, data) => {
            if (err) {
                console.log('Scan FAILED', err);
                throw new Error('Error while scanning table');
            }
            return data;
        }).promise();

        // ...必要に応じてテーブルデータを使用します ...
    }
};

Pythonで個人のAWSリソースを使用する

Alexa-hostedスキルのコードで、ロールがAWS Security Token Service (STS)を使用するとします。たとえば、次のコードは、AWS DynamoDBアクセス権限のあるロールの一時認証情報をリクエストし、DynamoDBテーブルをスキャンします。

import boto3

def handle(self, handler_input):
    # type: (HandlerInput) -> Response

    # 1.AWSリソースロールは、STS AssumeRoleアクションを使用するとします
    sts_client = boto3.client('sts')
    assumed_role_object=sts_client.assume_role(RoleArn="<Your AWS resource role ARN>", RoleSessionName="AssumeRoleSession1")
    credentials=assumed_role_object['Credentials']

    # 2.想定するロール認証情報を使用して、DynamoDBインスタンスを作成します
    dynamodb = boto3.resource('dynamodb',
                      aws_access_key_id=credentials['AccessKeyId'],
                      aws_secret_access_key=credentials['SecretAccessKey'],
                      aws_session_token=credentials['SessionToken'],
                      region_name='us-east-1')

    # 3.DynamoDBのテーブル操作を行います
    try:
        table = dynamodb.Table('TestTable')
        response = table.scan()
        #必要に応じてレスポンスを使用します。
    except ResourceNotExistsError:
        # 例外ハンドラー
        raise
    except Exception as e:
        # 例外ハンドラー
        raise e
    # 続行
    return (
        handler_input.response_builder.response
    )