Alexa-hostedスキルで個人のAWSリソースを使用する
Alexa-hostedスキルを作成すると、AlexaはコードとリソースをAWSに保存します。Alexa-hostedスキルの詳細については、Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成するを参照してください。
Alexa-hostedスキルを作成すると、3つのAWS Lambdaエンドポイント、メディアストレージ用のS3バケット、データ永続性のためのAmazon DynamoDBテーブルにアクセスできます。そのほかのAWSサービスを利用する必要がある場合やAWS無料利用枠を超えた場合、追加のリソースのプロビジョニングには独自のAWSアカウントが必要です。
AWS Lambda実行ロールARNを使用すれば、個人のAWSアカウントのリソースをシームレスに使用して、Alexa-hostedスキルの機能を拡張することができます。
権限の設定
Alexa-hostedスキルで個人のAWSアカウントのリソースを使用するには、Alexa-hostedスキルがアクセスするリソースへのアクセスを許可するようにAWS IAMロールを変更します。
AlexaスキルのARNを取得するには
- Alexa開発者コンソールを開いて、ログインします。
- コンソールでAlexa-hostedスキルを開きます。
- コードエディタの左上のAWS Lambda実行ロールARNのアイコンをクリックします。
- ARNをコピーします。
AWS IAMロールを変更するには
- AWSマネジメントコンソールを開き、ログインします。
- コンソールでIdentity and Access Management(IAM)ダッシュボードを開きます。
- IAMダッシュボードでロールをクリックします。
- 編集するロールの名前をクリックし、信頼関係タブをクリックします。
- 信頼関係の編集をクリックします。
-
次のように、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
)
関連トピック
最終更新日: 2020 年 11 月 05 日