Howto

Armadillo-IoT G4 を用いた物体認識プログラムの動作確認と AWS 各サービスの利用による分析方法 (AWS サービスセットアップ編)

必要な AWS 各サービスの設定を行います。作成するサービスは同じ AWS リージョンに作成するため、正しく設定されているか確認してください。当 Howto ではすべて ap-northeast-1 リージョン に作成します。他のリージョンを使用したい場合は Amazon RDS Proxy の作成が必要なためRDS プロキシでサポートされているエンジンとリージョンの可用性 をご確認ください。Amason QuickSight の設定については次章で行いますが、VPC 接続が必要なため Amazon QuickSight はエンタープライズ版が必要なことに注意してください。


以下の工程で実施します。

上記作業はすべて PC 上で実施します。

1. Amazon S3

Amazon Simple Strage Service(以下 S3)では物体認識プログラムが撮影した画像をアップロードするために使用します。S3 バケットが未作成の場合はバケットの作成を参考に作成してください。S3 バケット名以外はデフォルト設定で問題ないと思います。設定用 PC 上で AWS CLI が使える場合は以下のコマンドで作成することも可能です。

[PC ~]# aws s3 mb s3://< create_bucket_name >

バケット一覧に作成したバケット名が追加されていることを確認します。作成したバケット名は物体認識プログラムの 1.1 設定ファイル で使用します。

2. Amazon VPC

Amazon Relational Database Service(以下 Amazon RDS) で作成する DB インスタンスは Virtual Private Cloud (以下 VPC) である可能性が最も高くなります。そのため、今回は新規に Amazon VPC を作成します。また DB インスタンスに接続するには、セキュリティグループルールを設定する必要があります。

2.1 Amason VPC の作成

「チュートリアル: DB インスタンス用の Amazon VPC を作成する」の プライベートサブネットおよびパブリックサブネットを持つ VPC を作成するを参考に Amazon VPC を作成します。今回ウェブサーバーは不要のため、"Elastic IP" は作成しません。 Amazon VPC コンソールを開いて VPC の作成を開始してください。また、作成時には AWS リージョンが正しいか確認してください。 以下は今回例として作成した "Step 2: VPC with Public and Private Subnets" の設定項目です。もし、ナビゲーションペインの "New VPC Experience" がオンになっている場合は "VPC ウィザードの起動" 時に表示される VPC ウィザードが異なるため、オフにします。

項目名 設定値
IPv4 CIDR ブロック 10.0.0.0/16(デフォルト)
IPv6 CIDR ブロック IPv6 CIDR ブロックなし(デフォルト)
VPC名 g4-howto-vpc
テナンシー デフォルト
タグ デフォルト
キー: Name
値 - オプション: g4-howto-vcp
パブリックサブネットの IPv4 CIDR ブロック 10.0.0.0/24 (251 利用可能な IP アドレス)
アベイラビリティーゾーン ap-northeast-1a
パブリックサブネット名 パブリックサブネット
プライベートサブネットの IPv4 CIDR ブロック 10.0.1.0/24 (251 利用可能な IP アドレス)
アベイラビリティーゾーン ap-northeast-1a
プライベートサブネット名 プライベートサブネット
サービスエンドポイント スキップ
DNS ホスト名を有効化 はい
ハードウェアのテナンシー デフォルト

作成した Amazon VPC の状態が "Available" になっていることを確認します。

2.2 サブネットの作成

「デフォルト以外の VPC およびサブネット」の VPC にサブネットを作成するを参考にサブネットを作成します。アベイラビリティーゾーンは 上記で作成したアベイラビリティーゾーンと異なる場所を指定しないと Amazon RDS 作成に失敗します。

項目名 設定値
VPC ID <作成した VCP の ID 例: vpc-identifier (g4-howto-vpc)>
サブネット名 private-subnet-2
アベイラビリティーゾーン ap-northeast-1c
IPv4 CIDR ブロック 10.0.2.0/24

作成したプライベートサブネットが初期のプライベートサブネットと同じルートテーブルであることを確認してください。異なる場合は修正してください。

2.3 セキュリティグループの作成

セキュリティグループの作成を参考にセキュリティグループを作成します。また、セキュリティグループへのルールの追加を参考に、インバウンドルールとアウトバウンドルールを追加します。 セキュリティグループは以下の4つを作成します。

  • 物体認識結果格納用 Lambda 関数用
  • Amazon RDS Proxy用
  • Amazon RDS 用
  • Amazon Quicksight 用

2.3.1 物体認識結果格納用 Lambda 関数用セキュリティグループ

項目名 設定値
セキュリティグループ名 lambda-security-group
説明 lambda access security group
VCP g4-howto-vpc
インバウンドルール

なし

アウトバウンドルール
項目名 設定値
タイプ すべてのトラフィック
プロトコル すべて
ポート範囲 すべて
送信先タイプ Anywhere-IPV4
送信先 0.0.0.0/0
説明 - オプション

2.3.2 Amazon RDS Proxy 用セキュリティグループ

項目名 設定値
セキュリティグループ名 rds-proxy-security-group
説明 RDS Proxy security group
VCP g4-howto-vpc
インバウンドルール
項目名 設定値
タイプ MySQL/Aurora
プロトコル TCP
ポート範囲 3306
リソースタイプ カスタム
ソース Lambda 関数用セキュリティグループ
送信先 0.0.0.0/0
説明 - オプション
アウトバウンドルール
項目名 設定値
タイプ すべてのトラフィック
プロトコル すべて
ポート範囲 すべて
送信先タイプ Anywhere-IPV4
送信先 0.0.0.0/0
説明 - オプション

2.3.3 Amazon RDS 用セキュリティグループ

項目名 設定値
セキュリティグループ名 rds-security-group
説明 RDS security group
VCP g4-howto-vpc
インバウンドルール
項目名 設定値
タイプ MySQL/Aurora
プロトコル TCP
ポート範囲 3306
リソースタイプ カスタム
ソース RDS Proxy用セキュリティグループ
送信先 0.0.0.0/0
説明 - オプション
アウトバウンドルール
項目名 設定値
タイプ すべてのトラフィック
プロトコル すべて
ポート範囲 すべて
送信先タイプ Anywhere-IPV4
送信先 0.0.0.0/0
説明 - オプション

2.3.4 Amazon QuickSight 用セキュリティグループ

項目名 設定値
セキュリティグループ名 Amazon-QuickSight-access
説明 QuickSight access security group
VCP g4-howto-vpc
インバウンドルール1

ソースには各リージョンごとの "データソース接続の IP アドレス範囲" を指定する必要があります。以下の例は リージョンが ap-northeast-1 の場合 の設定例です。他のリージョンを使用している場合は AWS リージョン、ウェブサイト、IP アドレス範囲、エンドポイント を確認してください。

項目名 設定値
タイプ MySQL/Aurora
プロトコル TCP
ポート範囲 3306
リソースタイプ カスタム
ソース 13.113.244.32/27
送信先 0.0.0.0/0
説明 - オプション ap-northeast-1 region
インバウンドルール2
項目名 設定値
タイプ すべてのTCP
プロトコル TCP
ポート範囲 0-65535
リソースタイプ カスタム
ソース RDS 用セキュリティグループ
送信先 0.0.0.0/0
説明 - オプション ap-northeast-1 region
アウトバウンドルール
項目名 設定値
タイプ すべてのトラフィック
プロトコル すべて
ポート範囲 すべて
送信先タイプ Anywhere-IPV4
送信先 0.0.0.0/0
説明 - オプション

作成したセキュリティグループ名とセキュリティ ID をメモします。

2.4 DB サブネットグループの作成

ステップ 3: DB サブネットグループを作成するを参考にDB サブネットグループを作成します。

項目名 設定値
名前 db-subnet-group
説明 subnet group of db
VCP g4-howto-vpc

以下のサブネットを追加します。サブネットには二つのプライベートサブネットを指定します。

項目名 設定値
アベイラビリティーゾーン ap-northeast-1a
ap-northeast-1c
サブネット 10.0.1.0/24
10.0.2.0/24

DB サブネットグループリストに作成した DBサブネットグループが表示されたことを確認します。

3. Amazon RDS

物体認識プログラムの物体認識結果を格納する Amazon Relational Database Service(以下 Amazon RDS) の設定方法について説明します。

3.1 DB インスタンスの作成

Amazon RDS DB インスタンスの作成を参考にDB インスタンスを作成します。標準作成で作成します。データベースエンジンは Amazon RDS Proxy に対応している MySQL を指定します。Amazon RDS Proxy が対応しているデータベースエンジンについての詳細は RDS プロキシでサポートされているエンジンとリージョンの可用性をご確認ください。

項目名 設定値
エンジンのタイプ MySQL
バージョン 8.0.27
エディション MySQL Community
DBインスタンスサイズ 無料利用枠
DB インスタンス識別子 database-1
マスターユーザー名 admin(デフォルト)
パスワードの自動生成チェック外す <マスターユーザ用パスワード入力>
DB インスタンスクラス db.t2.micro

"接続" では VPC の接続設定を行います。

項目名 設定値
VPC g4-howto-vpc
サブネットグループ db-subnet-group
パブリックアクセス なし
DBインスタンスサイズ 無料利用枠
VPC セキュリティグループ 既存の選択
既存の VPC セキュリティグループ rds-proxy-security-group
rds-security-group
Amazon-QuickSight-access
アベイラビリティーゾーン ap-northeast-1a
DB インスタンスクラス db.t2.micro

"データベース認証" では先ほど設定したマスターユーザ名とパスワードで接続するため、"パスワード認証" を選択します。

項目名 設定値
データベース認証 パスワード認証

"追加の設定" で "最初のデータベース名" を設定します。入力したデータベースに対して物体認識結果を格納するため、 必ず指定してください。

項目名 設定値
最初のデータベース名 object_detect_db

起動まで数分かかります。ステータスが[利用可能]になれば DB インスタンスの作成は成功です。

4. Amazon RDS Proxy

Amazon RDS と Lambda 関数をつなぐ Amazon RDS Proxy の設定方法について説明します。

4.1 Amazon RDS Proxy の作成

シークレットを作成するを参考に RDS Proxy を作成します。「シークレットを作成するには (コンソール)」を実行します。シークレットの種類では「Amazon RDS データベースの認証情報を選択」します。「ユーザ名」と「パスワード」については Amazon RDS 接続用のマスターユーザのものを記載します。

項目名 設定値
シークレットの種類 Amazon RDS データベースの認証情報
ユーザ名 < Amazon RDS 接続用のマスターユーザ名 >
パスワード < Amazon RDS 接続用のマスターユーザ用パスワード >
暗号化キー DefaultEncryptionKey(デフォルト)
データベース <作成した DB 名>

シークレットの名前は例として database-1/MySQL を指定します。

項目名 設定値
シークレットの名前 database-1/MySQL
オプションの説明 RDS Proxy for database-1
タグ-オプション なし
リソースのアクセス許可 なし
シークレットをレプリケート なし
項目名 設定値
ローテーションスケジュール なし
ローテーション関数 なし

サンプルコードが表示されますが、気にせず保存します。

4.1.1 Amazon RDS への紐づけ

RDS Proxy の変更を参考に作成した Amazon RDS Proxy を Amazon RDS に紐づけます。

項目名 設定値
プロキシ識別子 proxy-for-rds
エンジンの互換性 MySQL
データベース database-1
接続プールの最大接続数 100 パーセント
Secrets Manager シークレット database-1/MySQL
IAMロール IAM ロールを作成
IAM認証 無効
サブネット プライベートサブネットのサブネット ID のみ設定
VPC セキュリティグループ 既存の選択
既存の VPC セキュリティグループ < Lambda 用のセキュリティグループ ID >
< Amazon RDS Proxy 用のセキュリティグループ ID >
拡張されたログ記録を有効にする チェック入れる

作成に成功すると2つのプロキシエンドポイントが出来ます。そのうち "読み取り/書き込み" 用のプロキシエンドポイントを物体認識結果格納用の Lambda 関数で使用します。

5. Amazon SNS

ユーザへの通知用の Amazon Simple Notification Service(以下 Amazon SNS) を設定します。ステップ 3: Amazon SNS トピックおよびサブスクリプションを作成するを参考にトピックを作成します。

項目名 設定値
タイプ スタンダード
名前 FindObjectTopic
表示名 FindObjecTopic
プロトコル Eメール
エンドポイント <通知を受け取る Eメールアドレス>

サブスクリプションの作成をすると、通知を受け取る Eメールアドレスに設定したアドレスへメールが届きます。"Confirm Subscription" のリンクをクリックしてトピックのステータスが "確認済み" になれば設定は終了です。また、"ここで作成した トピック ARN" は後述する通知用 Lambda 関数の実装に必要となります。

6. AWS Lambda

AWS Lambda は2つ作成します。一つは RDS に物体認識プログラムから渡された物体認識結果を格納するための Lambda 関数です。もう一つは物体認識が起きたときに異常を通知するための Lambda 関数です。

6.1 物体認識結果格納用 Lambda 関数

コンソールで Lambda の関数の作成を参考に Lambda 関数を一から作成します。当 Howto では python 3系を使って実装するため、ランタイムは python 3.9 を指定します。また、作成した IAM ロールにポリシーの追加が必要なため、設定から IAM ロール名をメモしておきます。

項目名 設定値
関数名 insert-rds-lambda
ランタイム python3.9
アーキテクチャ x86_64
実行ロール 基本的な Lambda アクセス権限で新しいロールを作成

この時、"insert-rds-lambda-role-xxxx という名前の実行ロールを作成します。"と表示されると思います。このロールに対して後ほどポリシーをアタッチするためメモしておいてください。Lambda 関数を作成したあとは以下のコマンドを実行して zip アーカイブをダウンロードするか、こちらのリンクから取得してください。ダウンロード後はLambda デプロイパッケージの Lambda コンソールを使用した zip アーカイブのアップロード方法を参考にアップロードしてください。

[PC ~]# wget https://download.atmark-techno.com/sample/armadillo_iot_g4-detect-object-and-aws-services-howto/insert-rds-lambda.zip

プログラムの詳細についてはチュートリアル: Amazon VPC の Amazon RDS にアクセスする Lambda 関数の設定をご確認ください。自環境に合わせて変数を修正する必要があるため、lambda_function.py を開きます。以下の変数を修正してください。テーブル名はデータベース内に新規で作成されます。

rds_proxy_host  = "<"読み取り/書き込み" 用のプロキシエンドポイント>"
name = "< Amazon RDS 接続用マスターユーザ名 >"
password = "< Amazon RDS 接続用マスターユーザ用パスワード> "
db_name = "<データベース名>"
table_name = "<テーブル名>"

修正後は "Deploy" ボタンを押して保存してください。

6.1.1 VPC 設定

VPC 内のリソースにアクセスするように Lambda 関数を設定する を参考に Lambda 関数の VPC 設定を行います。

はじめに物体認識結果格納用 Lambda 関数の IAM ロールに "AWSLambdaVPCAccessExecutionRole" のポリシーのアタッチ が必要です。「IAM チュートリアル: はじめてのカスタマー管理ポリシーの作成とアタッチ」のステップ 2: ポリシーのアタッチを参考に "AWSLambdaVPCAccessExecutionRole" のポリシーを物体認識結果格納用 Lambda 関数の IAM ロールにアタッチしてください。

次に「既存の関数に対して VPC を設定するには」を参考にVPC、サブネット、セキュリティグループを設定します。以下は設定例です。

項目名 設定値
VPC g4-howto-vpc
サブネット <プライベートサブネットの ID>
<追加のプライベートサブネットの ID>
セキュリティグループ < Lambda 関数用セキュリティグループ ID >

6.2 通知用 Lambda 関数

コンソールで Lambda の関数の作成を参考に Lambda 関数を一から作成します。当 Howto では python 3系 を使って実装するため、ランタイムは python 3.9 を指定します。

項目名 設定値
関数名 send-topic-lambda
ランタイム python3.9
アーキテクチャ x86_64
実行ロール 基本的な Lambda アクセス権限で新しいロールを作成

この時、"send-topic-lambda-role-xxxx という名前の実行ロールを作成します。"と表示されると思います。このロールに対して後ほどポリシーをアタッチするためメモしておいてください。Lambda 関数を作成したあとは以下のコマンドを実行して zip アーカイブをダウンロードするか、こちらのリンクから取得してください。ダウンロード後はLambda デプロイパッケージの Lambda コンソールを使用した zip アーカイブのアップロード方法を参考にアップロードしてください。

[PC ~]# wget https://download.atmark-techno.com/sample/armadillo_iot_g4-detect-object-and-aws-services-howto/send-topic-lambda.zip

自環境に合わせて変数を修正する必要があるため、lambda_function.py を開きます。以下の変数を修正してください。

topic_arn = '<作成した Amazon SNS のトピック ARN>'

修正後は "Deploy" ボタンを押して保存してください。また、先ほど作成したロールに sns 発行用のポリシーをアタッチします。以下の内容のポリシーを作成してアタッチしてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "*"
        }
    ]
}

アタッチすることで通知用 Lambda 関数のロールに sns 発行の許可を出すことができます。

6.3 AWS IoT Core ルールの設定

ステップ 2: AWS Lambda ルールアクションの AWS IoT ルールを作成するの「Lambda 関数を呼び出す AWS IoT ルールを作成するには」を参考に 作成した2つの Lambda 関数が呼び出されるように AWS IoT Core ルールを作成します。

項目名 設定値
ルール名 G4HowtoRule
SQL バージョンの使用 2016-03-23
ルールクエリステートメント SELECT * FROM '$aws/things/+/shadow/update/accepted'

アクションは以下の二つを設定します。

項目名 設定値
アクションを設定 メッセージデータを渡す Lambda 関数を呼び出す
関数名 物体認識結果格納用 Lambda 関数名
項目名 設定値
アクションを設定 メッセージデータを渡す Lambda 関数を呼び出す
関数名 通知用 Lambda 関数名

正しく作成できた場合は、各 Lambda 関数を確認した際にAWS IoT Core ルールのトリガーが設定されています。AWS IoT Core ルールのトリガーには今回設定した Lambda 関数の他にも Amazon DynamoDB データベースへのデータの送信や Amazon Kinesis Data Streams へのデータの送信も可能です。詳細はAWS IoT ルールアクションをご確認ください。


以上で AWS サービスセットアップ編を終了します。 次のArmadillo-IoT G4 を用いた物体認識プログラムの動作確認と AWS 各サービスの利用による分析方法 (物体認識プログラム動作確認編)に進んでください。