LoRaWAN で家から子供の初めてのおつかいを見守ろう

2022-10-03
日常で楽しむクラウドテクノロジー

神谷 優理 (監修 : 飯田 起弘)

こんにちは。AWS ジャパンでソリューションアーキテクト長期インターンとして活動している神谷です。

初めておつかいに行った時のこと、覚えていますか ? 私には歳が 2 つ離れた弟がいて、小学校低学年の頃に初めて親の同伴なしで一緒に近くのスーパーへ行きました。

親がいない不安から周囲にひたすら警戒し、当時の自分なりに知恵を絞って弟と偽名を使って呼び合うことで周りの人に自分の名前が知られないようにしたことをよく覚えています。同時にこのような子供を持ち、私の親も家でとても心配していたことと思います。

このような時に子供の居場所をリアルタイムで把握することができ、想定外の場所に行った場合に教えてくれるシステムがあると子供も親も安心して出かけられるのではないかということで、 AWS IoT Core for LoRaWAN を活用して子供の見守りシステムを作ってみました。

LoRaWAN は LoRa 上に構築された Low Power Wide Area Network (LPWAN) 通信プロトコルです。LoRa は、デバイス間の低消費電力、最大数十キロという広域通信を可能にする無線規格です。LoRaWAN に対応したデバイスを使うことで、小さな子供にスマホをもたせる必要がなく、省電力なデバイスで位置の取得が可能になります。

一方、LoRaWAN の仕組みでは、LoRaWAN デバイスとクラウドのデータ通信を仲介するための、LoRaWAN 対応のゲートウェイをユーザーが用意する必要があります。ただし、一度用意してしまえば追加の通信費用負担無しで利用し続けられるので、デバイスの数が増えたり、継続的に使い続ける場合には大きなコストメリットがあります。

さて、今回の見守りシステムは大きく分けて以下の要素でできています。

  1. 子供が LoRaWAN で位置情報を送信するセンサーデバイスを持つ
  2. 家の周辺をジオフェンスとして設定しておくことができる
  3. 親 (保護者) は子供の位置情報をブラウザでモニタリングできる
  4. 万が一子供がジオフェンスの外に出たら電話通知を受け取れる


まずは、完成した見守りシステムの仕組みを動画にまとめたので、こちらをご確認ください。

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


1. 全体のアーキテクチャ

1-1. アーキテクチャ図

見守りシステムの全体アーキテクチャは画像のように構築しました。

親 (保護者) は、 LoRaWAN ゲートウェイを自宅に設置し、位置センサーデバイスを子供の持ち物につけます。子供の位置は 定期的に LoRaWAN プロトコルを使用して AWS IoT Core に送信され、かつ Amazon Location Service のトラッカーに記録されます。 また、親は、子供が通る可能性がある道 (範囲) を登録します。この情報は、Amazon Location のジオフェンスで管理されます。

子供が範囲から外れてしまった場合には、 Amazon EventBridge にイベントが送信され、さらに Amazon Connect を通して親に電話がかかります。また、親は子供の位置を AWS Amplify を使って作成された Web から確認できます。

1-2. 利用する主な AWS のサービス

  • AWS Amplify
  • Amazon Cognito
  • Amazon Location Service
  • Amazon EventBridge
  • AWS IoT Core
  • AWS Lambda
  • Amazon Connect
  • Amazon DynamoDB

2. LoRaWAN のおつかい以外のユースケース

本記事ではより身近なユースケースとして「初めてのおつかいの見守り」をテーマにしていますが、LoRaWAN の低電力、長距離通信が可能といった特徴は実際は B2B の用途が多いと想定されます。多数のモノ・人の位置把握、地図上の領域から出た際に通知といった機能が求められる場合に良いのではないかと考えられます。

具体的には下記のようなユースケースに適用可能です。

  • レンタサイクリングの盗難防止・位置トラッキング、駐輪場から出た際に通知
  • 登山客の遭難防止、インターネットへ接続できない地域でも通信可能
  • 海水浴場での子供の位置把握、ブイに囲まれた領域から外に出た際に通知
  • マラソンランナーの位置把握


またこの記事は求める機能によって一部のみ実行することも可能です。
LoRaWAN を使った位置情報の取得だけを行いたい、Web 上での表示までは行わなくていいという方は 第 4 章を実行して下さい。逆に LoRaWAN のデバイスを持っていないが、位置情報を表示できるようになりたい、という方は 第 4 章の CDK の展開と 第 5 章以降を実行することで、手持ちのデバイスから AWS IoT Core の特定のトピックに位置情報を送ることで位置の表示ができるようになります。


3. 利用するハードウェア

LoRaWAN ゲートウェイ
AWS IoT Core for LoRaWAN が利用可能なゲートウェイは、AWS Partner Device Catalog で検索できます。日本で利用する場合は、この中から技適取得済みで、かつ日本で利用可能な周波数バンド AS923-1 を利用可能なものを選びます。
本記事では、TEKTELIC の KONA Micro IoT Gateway を使用しています。

LoRaWAN デバイス
今回、株式会社立花電子ソリューションズが提供している ZeroCarbonLoRaEvaBoard を使います。このボードに搭載されている Semtech LR1110 では、 GNSS (GPS) や Wi-Fi パッシブアンテナを使って位置情報の元となるデータを低消費電力でクラウドに送信し、クラウド側の処理で位置情報を解決することができます。なお、GNSS データを取得する場合は、 GPS アンテナを接続する必要があります。デバイスへのファームウェア書き込みには、Windows マシンが必要です。


4. LoRaWAN を使った位置情報の送信

この章では、ゲートウェイとデバイスをセットアップし、AWS IoT Core for LoRaWAN と接続していきます。

更に位置情報を処理して Amazon Location Service のトラッカーに送信します。この章で実行する範囲は画像の赤枠部分です。

4-1. ゲートウェイのセットアップ

このサブセクションではゲートウェイを AWS IoT Core for LoRaWAN に登録します。

本記事では、TEKTELIC の KONA Micro IoT Gateway を使用しています。セットアップは Tektelic のドキュメント に沿って進めていきます。

ご注意:この作業は機種やファームウェアバージョンによって異なります。ゲートウェイ販売元や販売代理店にお問い合わせ頂くか、お持ちの LoRaWAN ゲートウェイのドキュメントに沿って進めてください。


まず、ゲートウェイを自宅のネットワークに接続し、同一ネットワークに繋がっているPCからゲートウェイに ssh でログインします。

ssh root@<gateway-ip>

次はマネジメントコンソールで AWS IoT Core for LoRaWAN を開きます。
リージョンは東京リージョンを選択して下さい。

赤い枠で囲まれた「ゲートウェイ」をクリックします。

クリックすると拡大します

ゲートウェイを追加」をクリックします。

クリックすると拡大します

ゲートウェイの EUI にはデバイスの裏に書いてある GW ID を入力、周波数帯には、日本国内で使う場合は、 AS923-1 を指定して下さい。名前はオプションですが、わかりやすくするために記載しました。

他はデフォルトのままで、一番下のゲートウェイを追加 をクリックして下さい。

クリックすると拡大します

クリックすると拡大します

すでに別のアカウントに登録済みのゲートウェイの場合には、以下のようなエラーが発生することがあります。リージョンを変えて試すか、別のアカウントで使用中のゲートウェイを削除してお試しください。

競合が発生しました
GatewayEui exists or client request token was used with different request parameters withinthe 10-minute idempotency window.

ゲートウェイを設定」のセクションでは、下記の手順で操作を行います。

  1. 証明書を作成」をクリックし、その後、「証明書ファイルをダウンロード」をクリックして、証明書 (.pem) と秘密鍵 (.key) をダウンロードします。
  2. 次に、「CUPS エンドポイント」と「LNS エンドポイント」をメモに控えます。
  3. 次に「サーバー信頼証明書をダウンロード」をクリックして、信頼証明書をダウンロードします。
  4. 最後にゲートウェイのアクセス許可のセクションで、矢印を押して IoTWirelessGatewayCertManagerRole が出てこない場合は「ロールの作成」をクリックし、ロールを作成します。
  5. 矢印を押して IoTWirelessGatewayCertManagerRole を選択します。
  6. 送信」をクリックします。


ゲートウェイのクラウド側の設定はここまでです。

クリックすると拡大します

次は最初に ssh したゲートウェイに必要なファイルを用意します。

PC のターミナルに戻り、KONA Micro IoT Gateway の Getting Started Guide の 4.3.2 を実行してファイルの作成やリネームを行った上でゲートウェイの /etc/bstn 以下にファイルをコピーします。

具体的には、

  1. 1ダウンロードしたファイルの中から、xxxx.cert.pem ファイルを cups.crtxxxx.private.keycups.key にリネームします。
  2. cups.key をコピーして、ファイル名を tc.key にします。
  3. cups.crt をコピーして、ファイル名を tc.crt にします。
  4. lns.trusttc.trust にリネームします。
  5. cups.uri を作成し、先ほどの CUPS エンドポイントを書き込みます。
  6. tc.uri を作成し、先ほどの LNS エンドポイントを書き込みます。
  7. これらのファイルを scp などでゲートウェイの /etc/bstn/ に送ります。

次のように 8 つのファイルが保存されれば OK です。

root@kona-micro:/etc/bstn# ls
cups.trust     tc.key
cups.crt       cups.uri       tc.trust
cups.key       tc.crt         tc.uri

ファイルが揃ったら、

/etc/init.d/tektelic-bstn restart

でリスタートし、ゲートウェイの設定は完了です。

マネジメントコンソールに戻って最後に受信したアップリンクが更新されていることを確認できたら、このサブセクションは成功です。

クリックすると拡大します

4-2. デバイスのセットアップ

ZeroCarbonLoRa® EvaluationBoard へのファームウェアの書き込み

立花電子ソリューションズ のサイト から、ZeroCarbon LoRa® Evaluation Board 用の LoRaWAN 評価ファームウェアをダウンロードします。「ZeroCarbonLoRaEvaBoard ファームウェア更新手順.pdf」のドキュメントに沿ってファームウェアの書き込みを行います。続いて、「DevEUI_AppEUI_AppKey設定手順.pdf」に従い、DevEUI, AppEUI, AppKey を設定してください。DevEUI はデバイスごとにユニークな値にする必要があります。ランダムな値などを設定することを推奨します。設定したそれらの値はこの後使うのでメモしておいてください。

デバイスの起動

デバイスのUSBマイクロ端子にケーブルを接続し、PC や AC アダプタから給電します。電源が入ると、基板の LED が緑色に点灯します。デバイスのログを出力したい場合には、PC に接続し、シリアル通信のモニタリングを行ってください。(Baudrate:115200)

緑に光ることを確認できたら、次はマネジメントコンソールで AWS IoT Core for LoRaWAN を開きます。リージョンは先程と同じく東京リージョンを選択してください。

まずはプロファイルを追加します。赤い枠で囲まれた「プロファイル」をクリックします。

クリックすると拡大します

デバイスプロファイルとサービスプロファイルを作成します。
まず、「デバイスプロファイルを追加」をクリックします。

クリックすると拡大します

デフォルトのプロファイルに「AS923-1-A」を選択し、その他をデフォルトにしたままで、「デバイスプロファイルを追加」をクリックします。

クリックすると拡大します

次にサービスプロファイルを作ります。
サービスプロファイルを追加」を押します。

クリックすると拡大します

サービスプロファイルに lorawan_location_service_profile など名前をつけ、「サービスプロファイルを追加」を押します。

クリックすると拡大します

こちらのようにプロファイルが 2 つ作成されたことを確認します。

クリックすると拡大します

次にデバイスから受け取ったデータの送信先を設定します。赤い枠で囲われた「送信先」 をクリックします。

クリックすると拡大します

送信先を追加」をクリックします。

クリックすると拡大します

任意の送信先名を入力し、メッセージをパブリッシュするトピックに AWS CDK で用意した IoT Rule のトピック名の dt/lorawan と記入します。

クリックすると拡大します

次にデバイスのセットアップをします。マネジメントコンソールで赤い枠で囲われた「デバイス」をクリックします。

クリックすると拡大します

ワイヤレスデバイスを追加」をクリックします。

クリックすると拡大します

ワイヤレスデバイスの仕様には、OTAA v1.0.x を選択します。自分のデバイスの情報を確認し、DevEUIAppKeyAppEUI を入力します。わかりやすいようにワイヤレスデバイス名を入力します。

プロファイルには先ほど作成した 2 つのプロファイル、送信先には先程作成した送信先を選択します。

クリックすると拡大します

ステップ 2 は全てデフォルトで「デバイスを追加」をクリックします。

クリックすると拡大します

画像のようにデバイスが表示されていたら、デバイスの設定は完了です。

クリックすると拡大します

最後にデバイスからデータが送られているかを確認します。
デバイスの写真で丸く囲まれた位置にある小さいボタンを押し、数分待ちます。

前回のアップリンク受信日時 がマネジメントコンソール上で更新されていることが確認されたら、このサブセクションは成功です。

4-3. 位置情報を Amazon Location Service に送信

次に、デバイスから位置情報を取得するための元となるデータ (Wi-Fi スキャンデータ、GNSS データ) を AWS IoT Core for LoRaWAN に送信し、実際の緯度、経度を取得する部分です。

この部分は、 AWS CDK を用いて環境構築を行います。AWS CDK を用いることで、マネジメントコンソールでの操作をせずに、AWS のインフラをプログラムによって構築可能になります。

AWS CDK では、上図に示す2つの部分 LoRaCloud スタックと、Location スタックをそれぞれ構築します。

LoRaCloud スタックは、 lib/loracloud-stack.ts に記述されています。ZeroCarbon LoRa EvaluationBoard からは、位置情報を取得するのに必要なデータが、分割して送信されます。このスタックでは、デバイスから分割して送られてくるデータを含むペイロードをパースし、位置情報取得に必要なデータを一時的に DynamoDB に保存し、すべてのデータが揃ったら結合し、 実際の位置情報(緯度、経度)取得のために、 Semtech LoRa Cloud にリクエストを送信します。位置情報を受け取ると、そのデータを、以下のような JSON フォーマットの MQTT メッセージを AWS IoT Core のトピック dt/${devEUI}/location に送信します。

{
   "latitude": 12.34,
   "longitude": 45.67
}

Location スタックは、 lib/location-stack.ts に記述されています。このスタックでは、AWS IoT Core の MQTT トピック dt/+/location (+ は MQTT の仕様では、任意の文字列の意味) にメッセージが届くと、そこに含まれる位置情報を Amazon Location Service の Location Tracker に設定します。もし トラッカー がまだ作成されていない場合には、新規で作成します。作成するトラッカーの名前は、上記 Topic の + の部分の文字列になります。LoRaCloud Stack でパブリッシュされる MQTT メッセージでは、この部分に devEUI が設定されるため、トラッカー名は、devEUI の値になります。

※もし LoRaWAN デバイスが手元に無く、 MQTT 接続が可能なデバイスを使って試したい場合、 Location Stack のみをデプロイすることで実現ができます。

以下がデプロイの手順になります。

1. ソースコードをこちら からダウンロードし、 圧縮ファイルを展開します。展開したディレクトリのルートで、以下のコマンドを実行して AWS CDK など依存モジュールをインストールしてください。

$ npm ci

2. ターミナルで以下のコマンドを実行して、AWS CDK の Bootstrap を実行してください。この手順は、お使いのアカウントのリージョンにおいて AWS CDK を初めて使用する際に一回のみ必要なものです。処理が完了するまで 5 分程度かかります。AWS CLI の名前付きプロファイル を指定する場合は、 --profile オプションをつけてください。

$ cdk bootstrap

ターミナルで以下のコマンドを実行して、デプロイを実行してください。コマンド実行後メッセージが表示されますが、y/n と聞かれた際は y と入力して Enter キーを押してください。デプロイには 数分かかります。

$ cdk deploy LoracloudStack
$ cdk deploy LocationStack

設定が完了したら、立花電子ソリューションズのサイト を参考に、LoRa Cloud に API アクセスするためのトークンを取得します。以下の手順で、このトークンを、LoRaCloud スタックのデプロイによってすでに作成されている AWS Secrets Manager のシークレットにセットします。

  1. AWS Secrets Manager のマネジメントコンソール にアクセスします。
  2. prototyping/lorawan/loracloud というシークレットをクリックします。
  3. シークレットの値 の項目にある、「シークレットの値を取得する」をクリックし、同じく「編集する」をクリックします。
  4. キーは、変更せずに LoRaCloudToken とし、値の部分に先ほど取得した Token の値をペーストして「保存」を押します。(もともと設定されている値は削除してください)

4-4. 動作確認

ここまでの作業により、デバイスから送信されるデータを処理して、アプリケーションで使用できる位置情報として、トラッカーに保存する部分までが完成しました。次のセクションに移る前に、一旦ここまでの動作を確認します。

動作確認のために、AWS IoT Core の MQTT テストクライアント の機能を使用します。

AWS IoT Core のマネジメントコンソールで、「テスト」→「MQTT テストクライアント」をクリックします。

トピックのフィルターに、 # と入力し、「サブスクライブ」をクリックします。

正しく動作できていれば、 dt/lorawan トピックと、dt/+/location トピックにそれぞれメッセージが送られてきます。

クリックすると拡大します

4-5. トラブルシューティング

dt/lorawan にデータが飛んできていない


dt/lorawan にデータが来ているが、位置情報 (Wi-Fi, GNSS データ) が受信できない

  • 近くに Wi-Fi アクセスポイントが少ないなどの理由で十分なデータが取得できていない可能性があります。デバイス側のログをシリアルモニターで確認します。
  • GNSS データを取得するには、GPS アンテナを基板に接続する必要があります。また、衛星情報を取得可能な見通しの良い場所で試す必要があります。

5. AWS Amplify を使った Web アプリの作成

この章では React, Amplify Geo を使って、地図上にジオフェンスと子供の位置を表示するフロントエンドの仕組みを構築します。

クリックすると拡大します

この章で実行する範囲は画像の赤枠部分です。

5-1. Amplify Geo とは ?

Amplify Geo とは、Web アプリ上に簡単に地図を表示し、Amazon Location Service を簡単に使えるようにしたものです。 Amplify Geo を使うことで、地図の表示、地図上の位置検索、ジオフェンスの表示や作成ができるようになります。

5-2. Amplify プロジェクトの初期設定

まだ Amplify CLI をインストールしていない方は、まず Amplify CLI のインストールから始めます。

npm i -g @aws-amplify

下記を実行し、バージョンが出力されることを確認します。

amplify --version

Amplify CLI を利用するのが初めての方は、次のコマンドを実行して Amplify CLI の初期設定を行います。詳しくは こちら をご覧ください。

amplify configure

5-3. React アプリの作成

以下のコマンドを実行して、React アプリを作成します。

npx create-react-app lorawan-location-amplify
cd lorawan-location-amplify/

下記コマンドによりプロジェクトの初期設定を行います。全てデフォルトで実行します。

amplify init

5-4. 地図を表示してみる

AWS IoT Core for LoRaWAN のデバイスの設定の際に追加した地図を表示してみましょう。

最初に必要なライブラリのインストールをします。

npm install aws-amplify maplibre-gl maplibre-gl-js-amplify @aws-amplify/ui-react

次に表示する map を Amplify Geo を使って用意します。

amplify add geo

入力を求められる箇所について、

  • Provide a name for the Map: に対して lorawanLocationMap
  • Who can access this Map? に対して Authorized and Guest users

と回答します。

以下のような出力が得られます。

? Select which capability you want to add: Map (visualize the geospatial data)
✔ geo category resources require auth (Amazon Cognito). Do you want to add auth now? (Y/n) · yes
Using service: Cognito, provided by: awscloudformation
 
 The current configured provider is Amazon Cognito. 
 
 Do you want to use the default authentication and security configuration? Default configuration
 Warning: you will not be able to edit these selections. 
 How do you want users to be able to sign in? Username
 Do you want to configure advanced settings? No, I am done.
Successfully added auth resource lorawanlocationampli51a4ac50 locally

Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud

✔ Provide a name for the Map: · lorawanLocationMap
✔ Who can access this Map? · Authorized and Guest users
The following choices determine the pricing plan for Geo resources. Learn more at https://aws.amazon.com/location/pricing/
✔ Are you tracking commercial assets for your business in your app? · No, I do not track devices or I only need to track consumers' personal devices
Successfully set RequestBasedUsage pricing plan for your Geo resources.
Available advanced settings:
- Map style & Map data provider (default: Streets provided by Esri)

✔ Do you want to configure advanced settings? (y/N) · no
⚠️ Auth configuration is required to allow unauthenticated users, but it is not configured properly.
⚠️ Adding Map to your project requires the Auth category for managing authentication rules.
Successfully updated auth resource locally.
✅ Successfully added resource lorawanLocationMap locally.

✅ Next steps:
"amplify push" builds all of your local backend resources and provisions them in the cloud
"amplify publish" builds all of your local backend and front-end resources (if you added hosting category) and provisions them in the cloud

次に変更をクラウドに push するために以下のコマンドを実行します。

amplify push

Are you sure you want to continue? に対し、「Yes」と入力します。

✔ Successfully pulled backend environment dev from the cloud.

    Current Environment: dev
    
┌──────────┬──────────────────────────────┬───────────┬───────────────────┐
│ Category │ Resource name                │ Operation │ Provider plugin   │
├──────────┼──────────────────────────────┼───────────┼───────────────────┤
│ Auth     │ lorawanlocationamplixxxxxxxx │ Create    │ awscloudformation │
├──────────┼──────────────────────────────┼───────────┼───────────────────┤
│ Geo      │ lorawanLocationMap           │ Create    │ awscloudformation │
└──────────┴──────────────────────────────┴───────────┴───────────────────┘
? Are you sure you want to continue? Yes

この時に、Auth の Resource name lorawanlocationamplixxxxxxxx をメモしておきます。
次に、今作成した地図を表示してみようと思います。次のコードを src/App.js に貼り付けてください。

import { createMap } from "maplibre-gl-js-amplify";
import Amplify from "aws-amplify";
import "maplibre-gl/dist/maplibre-gl.css";
import awsconfig from "./aws-exports";

Amplify.configure(awsconfig);

function App() {
  async function initializeMap() {
    // おつかいのコースがよく見えるようにマップを表示
    const map = await createMap({
      container: "map",
      center: [139.715752, 35.632865],
      zoom: 16.69,
      hash: true,
    });
    return map;
  }

  initializeMap();
  return (
    <div style={{ height: "100vh", display: "flex", flexDirection: "column" }}>
      <div
        style={{
          display: "flex",
          alignItems: "center",
          height: "120px",
          backgroundColor: "#232F3E",
        }}
      >
        <h1 style={{ paddingLeft: "20px", color: "#FF9900" }}>
          LoRaWANで家から子供の初めてのおつかいを見守ろう
        </h1>
      </div>
      <div id="map" style={{ height: "100%" }} />
    </div>
  );
}

export default App;

App.js を上記のようにしたら、ターミナルで下記を実行し、ローカルのウェブサーバーを立ち上げて下さい。

npm start

ブラウザでこちらのような地図が表示されたら、このサブセクションは成功です。

クリックすると拡大します

5-5. ジオフェンスの追加

次に、子供が通るルートをジオフェンスとして設定していきます。

ジオフェンスとは、地図上の領域を仮想的な境界として設定したものです。
Amazon Location Service ではジオフェンスをトラッカーとリンクさせることで、位置情報を発信しているデバイスがジオフェンスを出た際にイベントを作成することができます。

まずは Amplify CLI を使用してジオフェンスコレクションを作ります。

amplify add geo

選択肢は以下のように選択します。

? Select which capability you want to add: Geofencing (visualize virtual perimeters)
✔ Provide a name for the ジオフェンス Collection: · geofenceCollection61600b14
✔ Geofencing requires a Cognito user group for Admin only access control settings. Do you want to add it now? (Y/n) · yes
Select "Create or update Cognito user pool groups" to add a Cognito user group
Please note that certain attributes may not be overwritten if you choose to use defaults settings.
Using service: Cognito, provided by: awscloudformation
What do you want to do? Create or update Cognito user pool groups
? Provide a name for your user pool group: amplifygeo
? Do you want to add another User Pool Group No
✔ Sort the user pool groups in order of preference · amplifygeo
✅ Successfully updated auth resource reactgeob25a166b locally

✅ Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud

✅ Successfully updated resource update locally

✅ Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud

Must pick at least 1 of 1 options. Selecting all options [amplifygeo]
✔ What kind of access do you want for amplifygeo users? Select ALL that apply: · Read geofence, Create/Update geofence, Delete geofence, List geofences

✅ Successfully added resource geofenceCollection61600b14 locally.

✅ Next steps:
"amplify push" builds all of your local backend resources and provisions them in the cloud
"amplify publish" builds all of your local backend and front-end resources (if you added hosting category) and provisions them in the cloud

ここまでできたら変更を push します。以下のコマンドを実行します。作成されるリソースを確認し、「Yes」を入力して下さい。

amplify push

続いて、以下のコマンドで、Map へのアクセス権限を Cognito グループ amplifygeo に設定します。

amplify update geo
? Select which capability you want to update: Map (visualize the geospatial data)
Only one option for [Select the Map you want to update]. Selecting [lorawanLocationMap].
✔ Restrict access by? · Individual Groups

ここで再び、 amplify push をおこないます。

次に下のコマンドでマネジメントコンソールの Amazon Cognito ユーザープール設定画面のリンクが出力されるので、ブラウザからアクセスします。

amplify auth console
Using service: Cognito, provided by: awscloudformation
? Which console User Pool
User Pool console:(URL)

ユーザーを作成」をクリックします。

クリックすると拡大します

ユーザー名とパスワードを入力し、「ユーザーを作成」をクリックします。

クリックすると拡大します

ユーザータブに新しいユーザーが追加されたのを確認できたら、次はこのユーザーを用意したユーザーグループに登録します。グループタブを開き、先ほど Amplify CLI で作成したユーザーグループ amplifygeo を選択します。

クリックすると拡大します

ユーザーをグループに追加」をクリックし、先ほど作成したユーザーを追加します。

グループメンバーにユーザー名が表示されれば設定完了です。

クリックすると拡大します

React のエディタを開き、App.js を下のように書き換えます。

import "./App.css";
import MainView from "./MainView";
import { withAuthenticator } from "@aws-amplify/ui-react";

function App() {
  return (
    <div className="App">
      <MainView></MainView>
    </div>
  );
}

export default withAuthenticator(App);

更に、MainView.js ファイルを作成し、次のコードを貼り付けます。

import { createMap, AmplifyGeofenceControl } from "maplibre-gl-js-amplify";
import { Amplify } from "aws-amplify";
import "maplibre-gl/dist/maplibre-gl.css";
import awsconfig from "./aws-exports";

import "maplibre-gl-js-amplify/dist/public/amplify-ctrl-geofence.css";

Amplify.configure(awsconfig);

function App() {
  async function initializeMap() {
    const map = await createMap({
      container: "map",
      center: [139.715852, 35.63266],
      zoom: 16.69,
      hash: true,
    });
    // ジオフェンスのコントローラ作成
    const GeofenceControl = new AmplifyGeofenceControl();
    // Geofenceコントローラをマップに追加
    map.addControl(GeofenceControl);

    return map;
  }

  initializeMap();
  return (
    <div style={{ height: "100vh", display: "flex", flexDirection: "column" }}>
      <div
        style={{
          display: "flex",
          alignItems: "center",
          height: "120px",
          backgroundColor: "#232F3E",
        }}
      >
        <h1 style={{ paddingLeft: "20px", color: "#FF9900" }}>
          LoRaWANで家から子供の初めてのおつかいを見守ろう
        </h1>
      </div>
      <div id="map" style={{ height: "100%" }} />
    </div>
  );
}

export default App;

npm start してウェブサーバーを立ち上げます。左にジオフェンスのコントローラが追加されました。

+Add をクリックして下さい。

クリックすると拡大します

好きなジオフェンスの名前をつけて保存します。

クリックすると拡大します

一旦保存した後に鉛筆マークをクリックすると、自由にジオフェンスを画面上で編集できるようになります。

クリックすると拡大します

地図上でジオフェンスを編集し、子供のおつかいルートになるように設定して下さい。save ボタンを押し、無事ジオフェンスの設定ができたらこのサブセクションは成功です。

クリックすると拡大します

5-6. トラッカーから位置情報を取得する API の追加

このサブセクションでは、デバイスの現在地を地図上に表示する API を Amplify CLI で作成します。30 秒に 1 度 API Gateway に対してリクエストを送り、リクエストは AWS Lambda で処理され、Amazon Location から取得された位置を返します。

まず Amplify CLI で API を作成します。

amplify add api

オプションについて、名前などは自分がわかりやすい名前、選択肢については次のように選びます。

? Select from one of the below mentioned services: REST
✔ Provide a friendly name for your resource to be used as a label for this category in the project: · lorawanLocationAPI
✔ Provide a path (e.g., /book/{isbn}): · /items
Only one option for [Choose a Lambda source]. Selecting [Create a new Lambda function].
? Provide an AWS Lambda function name: lorawanLocationFunction
? Choose the runtime that you want to use: NodeJS
? Choose the function template that you want to use: Serverless ExpressJS function (Integration with API Gateway)

Available advanced settings:
- Resource access permissions
- Scheduled recurring invocation
- Lambda layers configuration
- Environment variables configuration
- Secret values configuration

? Do you want to configure advanced settings? No
? Do you want to edit the local lambda function now? Yes

? Press enter to continue 
Successfully added resource lorawanLocationFunction locally.

Next steps:
Check out sample function code generated in <project-dir>/amplify/backend/function/lorawanLocationFunction/src
"amplify function build" builds all of your functions currently in the project
"amplify mock function <functionName>" runs your function locally
To access AWS resources outside of this Amplify app, edit the <project-dir>/amplify/backend/function/lorawanLocationFunction/custom-policies.json
"amplify push" builds all of your local backend resources and provisions them in the cloud
"amplify publish" builds all of your local backend and front-end resources (if you added hosting category) and provisions them in the cloud
✅ Succesfully added the Lambda function locally
✔ Restrict API access? (Y/n) · no
✔ Do you want to add another path? (y/N) · no
✅ Successfully added resource lorawanLocationAPI locally

✅ Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud

次に Lambda 関数の中で Amazon Location からデバイスの位置情報を取得できるようにソースコードを変更します。

エディタで amplify/backend/function/lorawanLocationFunction/src/app.js を開きます。

app.get("/items", function (req, res) {

の周辺を下のように書き換えます。この時 TrackerName と DeviceId は共に、デバイス EUI を入力します。

const aws = require("aws-sdk");
const location = new aws.Location();

/**********************
 * Example get method *
 **********************/

app.get("/items", function (req, res) {
  // Add your code here
  const params = {
    TrackerName: "70b3d57ed004f46f",
    DeviceId: "70b3d57ed004f46f",
  };
  location.getDevicePosition(params, function (err, data) {
    console.log(data.Position);
    if(err){
      console.log(err)
    }
    res.json({ success: "get call succeed!", url: req.url, position: data.Position });
  })
});

更に、Lambda 関数が Amazon Location へアクセスできるように次のように amplify/backend/function/lorawanLocationFunction/custom-policies.json を変更します。{} に囲まれた部分は適当な値に変更します。

[
  {
    "Action": ["geo:GetDevicePosition"],
    "Resource": ["arn:aws:geo:{region}:{12_digit_account_id}:tracker/{device_eui}"]
  }
]

ここまでの内容を push し、変更を反映させます。

amplify push

次に API Gateway で CORS を有効化します。

マネジメントコンソールで API Gateway を開きます。

API から今回作成した API を選択します。

クリックすると拡大します

リソースから /items を選択し、アクションから「CORS の有効化」を選択します。

クリックすると拡大します

  • Access-Control-Allow-Headers : 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'
  • Access-Control-Allow-Origin : '*'

になっていることを確認した上で、「CORS を有効にして既存の CORS ヘッダーを置換」をクリックします。

クリックすると拡大します

次にアクションから「API のデプロイ」を選択します。

クリックすると拡大します

デプロイされるステージでは dev を選び、「デプロイ」をクリックします。

クリックすると拡大します

API の用意はこれで完了です。次にデバイスの位置をブラウザ上にスマイルアイコンの形で表示します。

まず、デバイスの位置を表すアイコンを作り public フォルダに入れてください。
私は下のようなスマイルマークを作り、smiley.png としました。

先ほど作成した MainView.js ファイルを編集して次のようにします。

import { createMap, AmplifyGeofenceControl } from "maplibre-gl-js-amplify";
import Amplify from "aws-amplify";
import { Marker } from "maplibre-gl";
import "maplibre-gl/dist/maplibre-gl.css";
import "maplibre-gl-js-amplify/dist/public/amplify-ctrl-geofence.css";

import awsconfig from "./aws-exports";
import { addMarker } from "./addMarker";
import { displayTracker } from "./displayTracker";

Amplify.configure(awsconfig);

function App() {
  async function initializeMap() {
    const initialPosition = [139.715852, 35.63266];
    const initialZoom = 16.69;
    const getPositionIntervalInMilliseconds = 30000;
    const map = await createMap({
      container: "map",
      center: initialPosition,
      zoom: initialZoom,
      hash: true,
    });
    const GeofenceControl = new AmplifyGeofenceControl();
    map.addControl(GeofenceControl);
    const smileyMarker = new Marker(addMarker("smiley.png"))
      .setLngLat(initialPosition)
      .addTo(map);
    setInterval(function () {
      displayTracker(smileyMarker);
    }, getPositionIntervalInMilliseconds);
    return map;
  }
  initializeMap();
  return (
    <div style={{ height: "100vh", display: "flex", flexDirection: "column" }}>
      <div
        style={{
          display: "flex",
          alignItems: "center",
          height: "120px",
          backgroundColor: "#232F3E",
        }}
      >
        <h1 style={{ paddingLeft: "20px", color: "#FF9900" }}>
          LoRaWANで家から子供の初めてのおつかいを見守ろう
        </h1>
      </div>
      <div id="map" style={{ height: "100%" }} />
    </div>
  );
}

export default App;

addMarker.js displayTracker.js をそれぞれ下のように用意します。

addMarker.js

export const addMarker = (image) => {
  var el = document.createElement("div");
  el.className = "marker";
  el.style.width = "40px";
  el.style.height = "40px";
  el.style.backgroundImage = `url(${image})`;
  el.style.backgroundSize = "cover";
  return el;
};

displayTracker.js

import { API, Auth } from "aws-amplify";

export async function displayTracker(smiley_marker) {
  const apiName = "lorawanLocationAPI";
  const path = "/items";
  const user = await Auth.currentAuthenticatedUser();
  const token = user.signInUserSession.idToken.jwtToken;
  const myInit = {
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${(await Auth.currentSession()).getIdToken().getJwtToken()}`,
    },
    response: true,
  };

  API.get(apiName, path, myInit)
    .then((response) => {
      console.log(response.data.position);
      const position_data = response.data.position;
      smiley_marker.setLngLat(position_data);
    })
    .catch((error) => {
      console.log(error.response);
    });
}

これは 30 秒ごとに Location Service からデバイスの最新の位置を受け取るという方法で実装されています。

下のコマンドを実行し、スマイルマークがデバイスの位置に表示されていることを確認して下さい。また、デバイスを移動させて地図上の位置が変わることを確認します。

npm start

6. Amazon Connect による通知

5 章までの内容で、ブラウザ上にジオフェンスとデバイスの位置の表示ができるようになりました。

最後に Amazon Connect を使って、子供がジオフェンスの外に行ってしまった場合に電話がかかってくるように設定していきます。

この章で実行する範囲は画像の赤枠部分です。

6-1. Amazon Connect の新しいインスタンスを作成する

まず、Amazon Connect の新しいインスタンスを作成します。

マネジメントコンソールで Amazon Connect を検索し、「インスタンスを追加する」をクリックします。

ご注意:Amazon Connect については、かならず東京リージョンを選んでください。他のリージョンの場合正しく動作しない可能性があります。

クリックすると拡大します

Access URL にの入力欄に、lorawan-location-connect-<yourname> と記入して下さい。<yourname> には自分の名前や組織などユニークな値を入れてください。

クリックすると拡大します

次に、管理者を追加します。名前、ユーザー名、パスワード、メールアドレスなど必要な情報を記入し「次へ」をクリックします。

ステップ 3 と 4 はそのままでインスタンスを作成します。

クリックすると拡大します

3 分ほど経過するとインスタンスの作成が完了し、ステータスが アクティブ となります。

作成されたインスタンスの、 「インスタンスエイリアス」をクリックし、後の Lambda 関数の作成の際に必要になるため、Instance ARN をメモしておきます。

クリックすると拡大します

Access URL をクリックし、Amazon Connect のページを開きます。
Specify an administrator で入力した認証情報を用いてログインしてください。

こちらのような画面が見えたらこのサブセクションは成功です。

クリックすると拡大します

6-2. Contact Flow を作成する

Amazon Connect のダッシュボードの右上の English をクリックすると日本語を選択することができます。

左のメニューから「コンタクトフロー」を選択します。

クリックすると拡大します

コンタクトフローの作成」を押します。

クリックすると拡大します

右側の矢印をクリックし、「インポート」を押します。

クリックすると拡大します

JSON ファイルをアップロードする画面が表示されるので、下のコードを JSON ファイルとして保存し、アップロードします。

lorawan_location_contact_flow.json

{
  "Version": "2019-10-30",
  "StartAction": "815dd38a-bd50-4ce0-95fb-7fddf405cae9",
  "Metadata": {
    "entryPointPosition": { "x": 64, "y": 64 },
    "ActionMetadata": {
      "11d8d53b-2232-4565-a90e-c28854e0889f": {
        "position": { "x": 926.4000000000001, "y": 40 }
      },
      "17133fe9-c5f3-4c13-80b9-803c02a80726": {
        "position": { "x": 674.4000000000001, "y": 40 }
      },
      "815dd38a-bd50-4ce0-95fb-7fddf405cae9": {
        "position": { "x": 209.60000000000002, "y": 40 }
      },
      "49900e16-f94f-4123-aa55-54e8bfdfb530": {
        "position": { "x": 429.6, "y": 40 },
        "overrideConsoleVoice": false
      }
    },
    "name": "lorawan_location_contact_flow",
    "type": "contactFlow",
    "status": "published",
    "hash": {}
  },
  "Actions": [
    {
      "Parameters": {},
      "Identifier": "11d8d53b-2232-4565-a90e-c28854e0889f",
      "Type": "DisconnectParticipant",
      "Transitions": {}
    },
    {
      "Parameters": {
        "Text": "こんにちは、あなたの子供がジオフェンスの外に出たようです。迎えに行ったほうがいいかもしれません。"
      },
      "Identifier": "17133fe9-c5f3-4c13-80b9-803c02a80726",
      "Type": "MessageParticipant",
      "Transitions": {
        "NextAction": "11d8d53b-2232-4565-a90e-c28854e0889f",
        "Errors": [
          {
            "NextAction": "11d8d53b-2232-4565-a90e-c28854e0889f",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": { "FlowLoggingBehavior": "Enabled" },
      "Identifier": "815dd38a-bd50-4ce0-95fb-7fddf405cae9",
      "Type": "UpdateFlowLoggingBehavior",
      "Transitions": { "NextAction": "49900e16-f94f-4123-aa55-54e8bfdfb530" }
    },
    {
      "Parameters": { "TextToSpeechVoice": "Takumi" },
      "Identifier": "49900e16-f94f-4123-aa55-54e8bfdfb530",
      "Type": "UpdateContactTextToSpeechVoice",
      "Transitions": { "NextAction": "17133fe9-c5f3-4c13-80b9-803c02a80726" }
    }
  ]
}

クリックすると拡大します

アップロードが成功した場合、こちらのような画面になります。

このコンタクトフローは、日本語の音声で「こんにちは、あなたの子供がジオフェンスの外に出たようです。迎えに行ったほうがいいかもしれません。」と言い、そして電話が切れるコンタクトフローとなっています。

内容を確認したら、「公開」をクリックします。

クリックすると拡大します

後の Lambda 関数の作成の際に必要になるため、「追加のフロー情報の表示」をクリックし、コンタクトフローの ARN をメモしておきます。

クリックすると拡大します

6-3. 電話番号を用意する

左のメニューから「電話番号」を選択します。

クリックすると拡大します

電話番号の取得」をクリックします。

クリックすると拡大します

国・地域」ではアメリカ合衆国を選択、お好きな電話番号をお選びください。

問い合わせフローでは、先ほど作成した lorawan_location_contact_flow を選択し、保存します。

クリックすると拡大します

画像のように取得した電話番号が確認できたらこのサブセクションは成功です。

クリックすると拡大します

6-4. キューを追加する

左のメニューから「キュー」を選択します。

クリックすると拡大します

キューを追加」をクリックします。

クリックすると拡大します

キューの詳細で、lorawan_location_queue と名前をつけ、オペレーション時間を Basic Hours に設定します。

設定の欄ではデフォルトの発信者 ID 名に lorawan_location_caller 、アウトバウンド発信者 ID 番号に先ほど作成した電話番号、アウトバウンドウィスパーフローに Default outbound を入力します。

ここまで設定したら「保存」を押します。

クリックすると拡大します

今作成したキューを開き、「追加のキュー情報を表示」をクリックし、後の Lambda 関数作成のためにキュー ARN をメモしておきます。

クリックすると拡大します

6-5. トラッカーとジオフェンスをリンクさせる

次に、ジオフェンスから子供が出た場合にイベントが発生するようにしましょう。
Amazon Location Service のトラッカーとジオフェンスをリンクさせます。

マネジメントコンソールで Amazon Location Service を開き、デバイス EUI の名前のトラッカーを選択します。

クリックすると拡大します

コンシューマータブの「ジオフェンスコレクションをリンク」をクリック、作ったジオフェンスを選択して下さい。

クリックすると拡大します

リンクされたジオフェンスコレクションにジオフェンスが表示されたことを確認して下さい。

こうすることで、デバイスがジオフェンスの境界内に入った時、そして出た時に Amazon EventBridge にイベントが届きます。

6-6. ジオフェンスに出入りしたら Lambda 関数が実行されるようにする

Amazon EventBridge に届いたイベントが AWS Lambda 関数を実行するように設定します。

マネジメントコンソールで AWS Lambda を開きます。

関数の作成」をクリックします。

一から作成」を選択し、関数名を lorawan-location-lambda とします。ランタイムは Python3.9 を選択します。

クリックすると拡大します

関数を中身を下記のようにして下さい。{} で囲まれた値は自分の値に書き換えて下さい。

電話番号は +81 の後に、自分の電話番号の最初の0を除いたものを記入します。この際070, 080, 090かから始まる電話番号にかける際はクオータの引き上げの申請が必要です。

ContactFlowId, InstanceId, QueueId はメモしておいた ARN の最後の / から右の文字列を記入します。

ここまで用意できたら、忘れずに Deploy を押しましょう。

import json
import boto3

client = boto3.client('connect', region_name='ap-northeast-1')

def lambda_handler(event, context):
    print(json.dumps(event))
    is_enter_or_exit = event["detail"]["EventType"]
    print(is_enter_or_exit)
    if(is_enter_or_exit == "EXIT"):
        response = client.start_outbound_voice_contact(
            DestinationPhoneNumber='+81{phone_number}',
            ContactFlowId='{contact_flow_id}',
            InstanceId='{instance_id}',
            QueueId='{queue_id}',
        )
        print(response)

次に Lambda 関数の設定タブを開きます。

左のメニューから「アクセス権限」を選択し、実行ロールセクションのロール名をクリックします。

クリックすると拡大します

IAM の管理画面に移るので、許可ポリシーのセクションで、「許可を追加」>「ポリシーをアタッチ」を選択します。

クリックすると拡大します

Connect」と検索し、「AmazonConnect_FullAccess」を選択して、ポリシーをアタッチをクリックします。

クリックすると拡大します

ここまでで Lambda の設定は終わりです。ここで、テストイベントを作成し、Lambda 関数が呼ばれたときに、電話呼び出しが行われることを確認します。Lambda のマネジメントコンソールに戻り、先ほど作成した関数を選択し、テストのタブをクリックします。「イベントアクションをテスト」の項目で「新しいイベントを作成」を選択し、イベント名に、amazon-connect-test と入力します。「イベント JSON」には以下の JSON を入力します。

{
  "detail": {
    "EventType": "EXIT"
  }
}

入力したら「保存」をクリックし、最後に「テスト」をクリックします。

問題なく設定ができていれば、設定された電話番号に着信があるはずです。もし失敗する場合は、実行結果のログを確認してください。

クリックすると拡大します

次に、マネジメントコンソールで EventBridge を検索します。

左のメニューからルールを選択し、「ルールの作成」をクリックします。

クリックすると拡大します

名前は AmazonLocationMonitor-lorawan_location_geofence と入力、その他はデフォルトのままで「次へ」をクリックします。

クリックすると拡大します

ステップ 2 の「イベントパターンを構築」では、

イベントソース : AWS のサービス
AWS のサービス : Amazon Location Service
イベントタイプ : Location Geofence Event

次へ」をクリックします。

クリックすると拡大します

ステップ 3 の「ターゲットを選択」では、ターゲットを選択では Lambda 関数を、機能では、先程作成した Lambda 関数 lorawan-location-lambda を選択します。

次へ」をクリックします。

クリックすると拡大します

ステップ 4 「タグを設定をする」はデフォルトのままで「次へ」を押し、作成するものを確認したら「ルールの作成」をクリックします。

デバイスを持って自分が設定したジオフェンスを出入りし、電話がかかってくることを確かめましょう。


7. おつかいをする

お疲れ様でした!ここまでできたら設定は以上です。子供にデバイスを渡し、アイスを買ってきてもらうようお願いして下さい (自己責任の範疇でお願い致します)。

子供が家から出たら、子供の位置に応じて Web アプリ上のアイコンが動くことを確認します。アイコンが目的地まで行って戻ってくれば、電話はかかってきません。寄り道をせずにお買い物ができたということですね!

もし寄り道したりしてジオフェンスの領域を外れたら、電話がかかってくるでしょう。設定した音声メッセージが流れることを確認して下さい。

もし電話発信のテストがしたければ、ジオフェンスを編集して家までの道にジオフェンスの境界線が来るようにして試してみてください。


8. 今後の改善点

本記事では、AWS IoT Core のトピックに対して送られたメッセージを LoRa Cloud へ送り位置情報を取得するという流れを取りました。本記事執筆時点ではベータ機能ですが、AWS IoT Core for LoRaWAN の位置情報取得機能 を使うことで、このシステムを簡略化し、Semtech LoRa Cloud を用いずに AWS IoT Core の機能で位置情報を取得することができます。

今回、環境構築には、通知部分とデバイス設定部分に AWS マネジメントコンソール、ウェブアプリ部分に AWS Amplify、そしてデバイスからのデータのパース部分に AWS CDK を使いました。開発フェーズやユースケースなどによって使い分けが考えられます。今回手作業で用意したリソースに関しても AWS CDK 化して用意することで自動化・簡略化が可能になります。


9. まとめ

今回、家からおつかいをしている子供を見守るソリューションを構築しましたが、いかがだったでしょうか ?

マネージドサービスを利用することで、最低限のコードを書くだけでデバイスからの位置情報の取得からジオフェンスを超えた場合の電話通知機能まで実装することができました。ジオフェンスを超えた場合の通知方法は他にも SMS、メールなど様々な方法で簡単に実装することができます。

もっと AWS IoT Core for LoRaWAN を使ってみたい方は 公式のワークショップ などをご覧ください。

最後に、今回用意したリソースを削除するのを忘れないようにしましょう。
AWS CDK を使って用意したリソースは、

cdk destroy --all

で削除することができます。

Amplify CLI で作成したリソースは、

amplify delete

で削除することができます。

その他、

  • Amazon Connect インスタンス
  • EventBridge ルール
  • マネジメントコンソールから用意した Lambda 関数
  • AWS IoT for LoRaWAN のデバイスとゲートウェイ
  • Amazon Location Service のトラッカー

はマネジメントコンソールから削除します。


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

神谷 優理
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト 長期インターン / 東京大学大学院 修士 1 年

大学のサークル活動を通して AWS に興味を持ち、学部 2-3 年の歳にAWSの長期インターンに参加。その後 2 年間開発経験を重ねた上で再度挑戦したくなり、大学院 1 年夏に 2 度目の AWS 長期インターンに参加。インターンでは IoT 案件のプロトタイピングやデモの作成、AWS Certified - Solutions Architect Professional の資格を取得。
ものづくり全般・新しい技術に興味があり、大学院では農作業自動化に向けてロボットの開発に取り組む。好きなものは映画、鳥、ダンス、K-POP。

監修者プロフィール

飯田 起弘
アマゾン ウェブ サービス ジャパン合同会社
IoT プロトタイピングエンジニア

電機メーカーでソフトウェアエンジニアとして IoT 関連の新規事業の立ち上げを経験の後、AWSにてプロトタイピングソリューションアーキテクトとして、IoT 関連案件の PoC, 本番導入などの支援に携わる。

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する