Edited at

AWS IoT ボタンと Amazon Connect でトイレが詰まったら管理事務所に自動で電話する


我が社のトイレは詰まりやすい



どんなオフィスなのか

会社の占有エリアに関しては綺麗

office01.jpg

しかしながら建物がとても年季入った味のあるビル

bldg01.jpg

bldg02.jpg

共有設備のトイレも古いので詰まりやすいんだと思います。



詰まらせたら赤っ恥

sl01.png

sl02.png

sl03.png



毎日お腹壊す僕としては、いつ自分の番が来るかと気が気でない



現状詰まった時の対応フロー


  1. ヘルプデスクに伝える

  2. ビル管理に電話する

つまり、ビル管理の電話番号を控えておけば、自分で電話することで大衆に晒すことなく事態を収拾できる

が、ここは無駄にエンジニアリングする



匿名で連絡する仕組み



アーキテクチャ

clogged toilet architecture.png



AWS IoT 1-Click

対応機器のボタンをトリガーに Lambda などに連携できるサービス

$0.25/device



AWS IoT ボタン

AWS IoT 1-Click 対応機器

WiFiにつなげて使う

¥2,500/個

button.jpg



Amazon Connect

クラウドコールセンター

このAPIでビル管理に電話をかける

電話番号: $0.10/日

発信(日本): $0.1000/分



AWS Lambda

サーバーレスのコンピューティングサービス

これで Amazon Connect の API を叩く

料金



構築



Step1. Amazon Connect の contact flow を作成する


  • 最低限ボイスと文言設定して電話切ればOK!
    connect01.png

  • 左側に表示されているARN の instance id と contact flow id をあとの実装で使用します



Step2. AWS IoT 1-Click にデバイス登録する


  • スマホに AWS IoT 1-Click アプリをインストールして、デバイスを登録

  • デバイスを有効にする

  • WiFiを設定する



Step3. Lambda Function を実装する


main.ts

import Connect from "aws-sdk/clients/connect";

const connect = new Connect({ region: "ap-northeast-1" });

export const handler = async () => {
const result = await connect
.startOutboundVoiceContact({
InstanceId: process.env.INSTANCE_ID as string,
ContactFlowId: process.env.CONTACT_FLOW_ID as string,
SourcePhoneNumber: process.env.SOURCE_PHONE_NUMBER as string,
DestinationPhoneNumber: process.env.DESTINATION_PHONE_NUMBER as string
})
.promise();

return result;
};



lambda.tf

# Configure the AWS Provider

provider "aws" {
version = "~> 2.0"
region = "ap-northeast-1"
}

# Create a IAM role for Lambda
resource "aws_iam_role" "lambda" {
name = "CloggedToiletReporterLambdaRole"
assume_role_policy = data.aws_iam_policy_document.assume_role_lambda.json
}

data "aws_iam_policy_document" "assume_role_lambda" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]

principals {
type = "Service"
identifiers = ["lambda.amazonaws.com"]
}
}
}

resource "aws_iam_role_policy_attachment" "lambda_basic_execution" {
role = aws_iam_role.lambda.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

resource "aws_iam_role_policy_attachment" "amazon_connect" {
role = aws_iam_role.lambda.name
policy_arn = "arn:aws:iam::aws:policy/AmazonConnectFullAccess"
}

// Create a Lambda function
data "archive_file" "function" {
type = "zip"
source_dir = "./dist"
output_path = "code.zip"
}

resource "aws_lambda_function" "clogged_toilet_reporter" {
filename = data.archive_file.function.output_path
source_code_hash = data.archive_file.function.output_base64sha256
function_name = "CloggedToiletReporter"
handler = "main.handler"
role = aws_iam_role.lambda.arn
runtime = "nodejs10.x"
timeout = 60
environment {
variables = {
INSTANCE_ID = var.INSTANCE_ID
CONTACT_FLOW_ID = var.CONTACT_FLOW_ID
SOURCE_PHONE_NUMBER = var.SOURCE_PHONE_NUMBER
DESTINATION_PHONE_NUMBER = var.DESTINATION_PHONE_NUMBER
}
}
}

variable "INSTANCE_ID" {}
variable "CONTACT_FLOW_ID" {}
variable "SOURCE_PHONE_NUMBER" {}
variable "DESTINATION_PHONE_NUMBER" {}




Step4. AWS IoT 1-Click プロジェクトを作成する


  • AWS コンソールで AWS IoT 1-Click サービスを開き、プロジェクトを作成

  • 上記 Lambda function を紐づけるデバイステンプレートを作成

  • デバイステンプレートに上記ボタンを紐づけるプレイスメントを作成



疎通確認

隣の席の人にかけるように設定しました

test01.jpg

ボタンを押します

test02.jpg

電話きました

test03.jpg

「3階男子トイレ手前側です。うんちが詰まりました。ご対応よろしくお願いいたします。」

test04.jpg

うまくできましたので、あとは通話先をビル管理に変更して、ボタンをトイレに置いて完了です



まとめ



参考リンク