LoginSignup
7
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-08
1 / 20

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


どんなオフィスなのか

会社の占有エリアに関しては綺麗
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

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


まとめ


参考リンク

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4