概要
- Amazon Connectには留守番電話機能は無いため個別に作成する。
- 基本の考え方等は『[Amazon Connect]営業時間外に着信したビジネスチャンスを失わないように留守番電話機能をつけてみた』をもとにしています。
- S3でWebサイトをホスティングします。そこに留守番電話を聴くためのHTMLを配置します。
- Cognito(コグニート)を利用してkinesis Video StreamsデータをWAVに変換したデータが保存されているバケットへアクセス権を付与します。
- セキュリティには配慮していませんので、留守番電話を聴く画面にCoginito(コグニート)のキーを貼り付けて全世界に公開しています。
使用ユーザー
- IAMユーザー
手順
Cognito(コグニート)による権限設定
-
AWSにサインインします。
- アカウント、ユーザー名、パスワードを入力してサインインします。
アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
- アカウント、ユーザー名、パスワードを入力してサインインします。
-
『AWSマネジメントコンソール』画面にある「サービスを検索」にCognitoと入力し、検索結果から《Cognito》をクリックし、Amazon Cognito コンソール(https://console.aws.amazon.com/cognito/)を開きます。
-
以下の項目を選択、入力して《プールの作成》をクリックします。
- IDプール名:適当な名前を入力します。
- 認証されていないIDに対してアクセスを有効にする:選択します。
-
作成したロールに必要な権限を付与するため、『AWSマネジメントコンソール』画面にある「サービスを検索」にIAMと入力し、検索結果から《IAM》をクリックし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。
-
- WAV変換後のデータをS3から取得するための権限
- Bucketに設定する権限
- ListBucket
- GetBucketTagging
- フォルダに設定する権限
- GetObject
- GetObjectTagging
- Bucketに設定する権限
- WAV変換後のデータをS3から取得するための権限
-
「アクション」に今回利用するGetBucketTaggingを上書き入力し、《GetBucketTagging》をクリックし、選択状態にします。
-
- Bucket name:kinesis Video StreamsデータをWAVに変換したデータが保存されているS3のバケット名
- Bucket name:my-baseXXXXXXXXX
- Bucket name:kinesis Video StreamsデータをWAVに変換したデータが保存されているS3のバケット名
-
「アクション」に今回利用するGetObjectTaggingを上書き入力し、《GetObjectTagging》をクリックし、選択状態にします。
-
- Bucket name:kinesis Video StreamsデータをWAVに変換したデータが保存してあるS3のバケット名
- Bucket name:my-baseXXXXXXXXX/my-voicemessageXXXXXXX/wav
- Object name:すべてにチェックを付ける(テキストボックスには*が入力される)
- Bucket name:kinesis Video StreamsデータをWAVに変換したデータが保存してあるS3のバケット名
留守番電話を聴く画面の作成
- 以下のコードで各自で変える部分
- AWS.config.region変数、AWS.config.credentials変数:先ほどメモした、CognitoのreagionとIdentityPoolIdを設定する
- bucketName変数、prefix変数に指定する値:kinesis Video StreamsデータをWAVに変換したデータが保存されているS3のバケット名とフォルダ名
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Voice Mail Viewer</title>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.283.1.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- <link rel="stylesheet" type="text/css" href="style.css"> -->
</head>
<body>
<h1 id="time">留守番電話</h1>
<audio id="sound" preload="auto">
</audio>
<table id="contents"/ border=1>
<script>
AWS.config.region = 'XXXXXXXXX';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXX',
});
const bucketName = 'my-baseXXXXXXXXX';
const prefix = 'my-voicemessageXXXXXXXXX/wav/'
const s3 = new AWS.S3();
async function refresh(){
const list = await s3.listObjects({Bucket: bucketName, Prefix: prefix}).promise();
const keys = list.Contents.map(v => v.Key).filter( v => {
if (v.indexOf('.wav') >= 0) {
return true;
}
});
let items = await Promise.all(keys.map(async (key)=>{
// S3上のオブジェクトのタグ情報を取得する
const tagging = await s3.getObjectTagging({Bucket: bucketName, Key: key }).promise();
const customerEndpoint = tagging.TagSet.find((v => { return v.Key == "customerEndpoint"}))["Value"];
const startTimestamp = Number(tagging.TagSet.find((v => { return v.Key == "startTimestamp"}))["Value"]);
const item = {
customerEndpoint: customerEndpoint,
startTimestamp: dateString(new Date(startTimestamp)), // yyyy/mm/dd hh:mm
key: key
};
return item;
}));
// 録音時間でソートする
items = items.sort((a, b) => b.startTimestamp - a.startTimestamp);
const table = $("#contents");
const tr = table.append($("<tr></tr>"))
tr.append("<th>着信時間</th>")
tr.append("<th>発信番号</th>")
tr.append("<th></th>")
// 一覧の表示
items.forEach( item => {
const customerEndpoint = $("<td></td>").text(item.customerEndpoint.replace("81","0"));
const startTimestamp = $("<td></td>").text(item.startTimestamp);
const listenButton = $("<td><img src=listen.png></td>").click(()=> {listen(listenButton,item.key)});
const tr = table.append($("<tr></tr>"))
tr.append(startTimestamp)
tr.append(customerEndpoint)
tr.append(listenButton)
});
}
refresh();
// スピーカーのアイコンをクリックした際にWAVファイルを取得する
async function listen(element, key) {
var params = {
Bucket: bucketName,
Key: key
};
const data = await s3.getObject(params).promise();
var blob = new Blob([data.Body], {type : 'audio/wav'});
element.html('<audio src=' + URL.createObjectURL(blob) + ' controls></audio>');
}
function dateString(date) {
const year = date.getFullYear();
const mon = (date.getMonth() + 1);
const day = date.getDate();
const hour = date.getHours();
const min = date.getMinutes();
const space = (n) => {
return ('0' + (n)).slice(-2)
}
let result = year + '/';
result += space(mon) + '/';
result += space(day) + ' ';
result += space(hour) + ':';
result += space(min);
return result;
}
</script>
</body>
</html>
-
留守番電話一覧画面で利用するアイコンをダウンロードするのでICOON MONOを開きます。
-
アイコンを検索するので検索欄に以下の文言を入力して検索します。
- 検索文言:スピーカー
-
アイコンを保存したフォルダにテキストファイルを作成し、開いて上記のindex.htmlをコピー&ペーストします。
-
保存してテキストファイルを閉じます。
-
テキストファイルの名前を「index.html」に変更します。
留守番電話を聴く画面をホスティングするS3を作成
- my-hostingXXXXXXXXX:作成したバケット名に変更してください。
{
"Version":"2012-10-17",
"Statement":[{
"Sid":"PublicReadForGetBucketObjects",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::my-hostingXXXXXXXXX/*"
]
}
]
}
- my-hostingXXXXXXXXX:作成したバケット名に変更してください。
- reagionXXXXXX:作成したバケットのリージョン名に変更してください。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://my-hostingXXXXXXXXX.s3-website-reagionXXXXXX.amazonaws.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
<AllowedHeader>X-Amz-Content-Sha256</AllowedHeader>
<AllowedHeader>X-Amz-Date</AllowedHeader>
<AllowedHeader>x-amz-security-token</AllowedHeader>
<AllowedHeader>X-Amz-User-Agent</AllowedHeader>
</CORSRule>
</CORSConfiguration>
-
AWSにサインインします。
- アカウント、ユーザー名、パスワードを入力してサインインします。
アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
- アカウント、ユーザー名、パスワードを入力してサインインします。
-
『AWSマネジメントコンソール』画面にある「サービスを検索」にS3と入力し、検索結果から《S3》をクリックし、Amazon S3 コンソール(https://console.aws.amazon.com/s3/)を開きます。
-
「バケット作成」画面が表示されるので、以下の項目を選択、入力して《次へ》をクリックします。
- バケット名:世界中で一意になる名前を付ける
- my-hostingXXXXXXXXX
- リージョン:作成するを選択します。
- バケット名:世界中で一意になる名前を付ける
-
- 今回はデフォルトのまま
-
- 今回はデフォルトのまま
-
「アップロード」画面が表示されるので、ドラッグ&ドロップまたは、《ファイルを追加》ボタンを押してindex.htmlとlisten.pngをアップロードします。
-
- 今回はデフォルトのまま
-
ストレージクラスの設定を確認して、《次へ》をクリックします。
- 今回はデフォルトのまま
-
- このバケットを使用してウェブサイトをホストする:選択します。
- インデックスドキュメント:index.html
-
- パブリックアクセスをすべてブロック
-
確認画面が表示されるので、以下の項目を入力して《確認》をクリックします。
- 確認フィールド:確認
-
HTMLが保存されているバケットからJavaScriptでデータを取得できるようにするため《アクセス権限》をクリックします。
参考サイト
- [Amazon Connect]営業時間外に着信したビジネスチャンスを失わないように留守番電話機能をつけてみた
- 例: 静的ウェブサイトをセットアップする
- CloudFrontとS3のCORS対応
- CORS(Cross-Origin Resource Sharing)について整理してみた