Amazon Web Services ブログ
タグを使用してAWS IoTリソースの管理とセキュリティを改善する
スマートビルディング、ユーティリティ、製造システム、コネクテッド製品などの環境を運用するソリューションプロバイダーは、マルチテナントに展開されるIoTプラットフォームを用いたB2Bサービスを提供します。ユースケース、種類、場所、およびテナントごとにこれらのリソースを安全に管理するのは難しい場合があります。
モノの階層的なグループを作成することは一般的なパターンですが、マルチテナンシーにうまく対応していません。たとえば、同じテナントが複数の都市にオフィスを借り、他のテナントと一部の建物を共有する場合、階層的なグループを作成してこれをうまく表現することはできません。一方で、同じリソースが異なるテナント(コネクテッドビークル、賃貸オフィススペース、コネクテッドデバイスなど)によって使用される可能性があります。
この投稿では、IoTのマルチテナント展開でAWSタグを使用して、そのような環境でのAWS IoTリソースの管理とセキュリティを改善する方法について説明します。まず、リソースのタグ付けが重要である理由について説明し、次にAWS IoTのタグ付け機能について掘り下げます。そして、架空のマルチテナントスマートビルディング環境でタグを設定し、使用する手順を実行します。
リソースのタグ付けが重要なのはなぜですか?
タグは、AWSリソースに設定できるキーと値のペアの形式のラベルです。特定のリソースに関する追加情報とコンテキストを提供します。タグによって、リソースの所有者、リソースが使用される環境、および要件に基づいたその他の技術的またはビジネス的な属性を識別できます。
効果的なタグ付けポリシーを使用すると、さまざまなサービスからすべてのAWSリソースを追跡できます。タグでグループ化された独自のリソースセットを構築することにより、要件に応じてそれらを管理します。
タグ付けにはさまざまな目的があります。タグの最も一般的な使用法は、コストの割り当てを制御することです。AWS Cost Explorerはリソースに割り当てられたタグを使用して、AWSコストをタグで分類し、それに応じて詳細な請求レポートを作成できます。タグを使用すると、特定のコンテキストで消費されるさまざまなサービス(AWS IoT Core、Amazon EC2インスタンス、Amazon S3バケット、AWS Lambda関数など)からコストをグループ化できます(たとえば、1つのプロジェクトまたは共有のIoTサービスのうち1つのテナントで消費されたコストなど )。
異なるタグを使うことで、特定のテナント、ビジネスユニット、コストセンター、顧客、プロジェクト、アプリケーション、または任意の属性のすべてのリソースにフラグを立てることができ、コスト配分に対するきめ細かく統合的なアプローチを可能にします。
タグのもう1つの直接的な利点は、タグまたはタグの一部に基づいてAWSマネジメントコンソールでリソースをフィルタリングできることです。これにより、プロジェクト、組織、または環境の運用のための任意のグループに関連するすべてのリソースを表示できます。カスタムコンソールが作成され、これは、コンソールまたはリソースグループAPIを介して設定できるリソースグループに基づいています。AWS IoT Analytics、AWS IoT Core、AWS IoT Device Defender、およびAWS IoT Device Managementはリソースグループをサポートしています。
タグは、タグに基づくアクセス制御を許可することにより、セキュリティポリシーを提供することもできます。IAMポリシーは、タグに基づいてリソースポリシーを定義するように設定できます。IAMポリシーでタグを使用すると、タグの値に基づいてリソースのグループへのアクセスを制御できます。
タグは、たとえば、営業時間後に停止する必要がある開発リソースなど、一部の自動化されたアクティビティに関係するリソースを識別するために使用できます。タグは、特定のAWS IoT Device Defender監査の対象となるデバイスグループを識別することもできます。
これらのさまざまな目的を果たすために、AWSタグ付け戦略のベストプラクティスに基づいて独自のタグ付けの戦略を作成できます。
IoT固有のタグ付け機能
まず、膨大な数のモノが接続される可能性を考えると、IoTのモノに直接タグを付けることはできません。代わりに、モノのグループにタグを付けることができます。したがって、タグ付けの戦略をモノのグループに適用します。
モノはさまざまな方法でグループ化できます。AWS IoT Coreデバイスレジストリにより、階層的なモノのグループを作成できます。モノは複数のグループに属することができます。後の例では、場所ごと(デバイスのグループを形成する建物の各フロア)にグループ化されます。このようなグループにタグを適用できます。
動的なグループを定義することもできます。グループに属する条件は、デバイスの接続ステータス、シャドウの値、またはレジストリのパラメータに関するクエリルールによって定義され、グループを動的にします。たとえば、25°Cを超える温度を示すセンサーのグループや、現在接続されており、ダウンストリームのデータとコマンドを受信する準備ができているすべてのデバイスのグループを作成できます。このような動的なグループにタグを適用すると、それらの動的なグループに関連するデバイスをすばやく識別し、適切なアクションを実行できます。
請求グループは、請求目的のために作成されたモノのグループであり、モノの請求可能な情報を収集します。
作成する各請求グループにタグを付けて、どのテナント、テナント内のビジネスユニット、製品、またはプロジェクトのモノが使用されているかを特定できます。これは、タグによって集計された使用量とコストを含むAWSコスト配分レポートの一部です。
モノは単一の請求グループにのみ属することができ、請求グループを階層で編成することはできません。請求グループ機能の詳細については、請求グループを参照してください。
他のAWS IoT Coreリソースにタグを付けることもできます:
- モノのタイプ – いくつかのモノのタイプを、類似するモノのタイプに対する特定のグループに属させるためにタグ付けすることができます。
- トピックのルールは、特定のアプリケーションがこのルールを使用するようにタグ付けできます。
- ジョブ、スケジュールされた監査、およびセキュリティプロファイルもタグ付けして、自動化を促進できます。
AWS IoTのマルチテナント展開のためのタグの適用
この例では、マルチテナントなスマートビルディングにIoTをセットアップする例を見て、タグをモノのタイプ、階層的なモノのグループ、および請求グループに適用する方法を学習します。
架空の会社であるExampleCorpは、さまざまなビジネスにレンタルできるオフィススペースを提供し、エネルギー効率の高いウェルネスオフィスサービスを提供しています。これらのサービスは、スマートライト、人感センサー、温度センサー、大気質センサーなどのスマートデバイスを利用しています。ExampleCorpは、建物の敷地を管理するためにAWS IoTサービスを使用しています。ExampleCorpは、種類に応じてモノを管理する必要があり、いくつかのモノのタイプを作成します。
モノのタイプの定義とタグ付け
まず、モノのタイプを定義して、ExampleCorpが使用しているさまざまな種類のモノを明確に識別します。AWS IoT Coreコンソールで、管理、タイプを選択します。
コンソールでモノのタイプを作成するとき、タグを直接適用できます。または、タグ付けのAPIを使用してタグを設定することもできます。このモノのタイプにタグを割り当てると、CLIまたはAPIの両方から、同様のモノをすばやく一覧化しアクションを適用できます。
LightBulbsというモノのタイプを選択すると、このモノのタイプとこのタイプに適用されるタグの詳細が表示されます。
モノのタイプが適切にタグ付けされると、特定のタグでタグ付けされたすべてのモノのタイプを簡単にリストできます。以下は、TemperatureSensorとLightBulb-versionAの両方のモノのタイプをExampleCorpに提供しているメーカーAnyCompany1によって生成されたすべてのモノのタイプを取得する例です。
aws resourcegroupstaggingapi get-resources --tag-filters Key="Manufacturer",Values="AnyCompany1" | awk -F\/ '/ResourceARN/ {print $2}' | awk -F \" '{print $1}'
TemperatureSensor LightBulb-versionA
この時点から、このモノのタイプのすべてのモノをリストし、会計のために、またはAWS IoTジョブコマンドへのエントリとして使用できます。
モノを論理的にグループ化し、グループにタグを付ける
モノのタイプを適切に作成してタグ付けした後、ExampleCorpはAWS IoT Coreコンソールでいくつかのデバイスをオンボードしました。
さらに、サービスの提供と管理を容易にするために、ExampleCorpはユースケースおよびフロアごとにグループ化することを決定します。
グループを作成するには、AWS IoT Coreコンソールで、管理、モノのグループを選択します。
次の図は、スマート電球が設置されたさまざまな場所を表すサブグループに分割された、電球の階層的なグループを示しています。LightBulbsグループの下の「グループ」タブを選択して、すべてのサブグループをリストします。
グループ名(Building1FirstFloor、Building1SecondFloor、Building2)をクリックしてこの階層へ移動し、「グループの追加」コマンドでサブグループを追加できます。
モノのグループは、その場所(建物、フロア)とユースケースに従って物を整理するのに適した階層構造を持っています。ただし、ExampleCorpは、顧客が使用するデバイスのセットをすばやく特定したいと考えています。
グループ内のすべてのモノをリストすることは可能ですが、タグをさまざまなモノのグループに割り当てると、CLIまたはAPIの両方から、モノのグループをすばやくリストしてアクションを適用できます。この例では、モノを使用する顧客を表すタグがモノのグループに割り当てられます。
次のスクリーンショットでは、AnyCompany2という会社がBuilding2の1階と3階を借りており、これらのモノのグループに適切なタグ(customerName = AnyCompany2)が設定されています。次のIoTコンソールのスクリーンショットは、Building2の1階を表すモノグループに適用されたタグを示しています。LightBulbsグループの下の「リソースタグ」タブを選択して、このグループに関連付けられたタグを表示します。
ExampleCorpが特定の顧客によって使用されているモノを一覧表示する場合、CLIコマンドを実行します。次のコードの例は、特定の顧客が使用しているモノのグループからすべてのモノをリストします。この例では、タグcustomerName =“ AnyCompany2”を持つモノのグループからすべてのものをリストします。
# Get the list of all resource groups tagged for the customer
# First, retrieve the thing group tagged for this customer
aws resourcegroupstaggingapi get-resources --tag-filters Key="customerName",Values="AnyCompany2" | awk -F\/ '/ResourceARN/ {print $2}' | awk -F \" '{print $1}'
ThirdFloor
firstFloor
# Use those group names to retrieve the list of things within these groups
aws iot list-things-in-thing-group --thing-group-name ThirdFloor
{
"things": [
"lightBulbs90",
"lightBulbs93",
"lightBulbs99",
"lightBulbs92",
"lightBulbs94",
"lightBulbs97",
"lightBulbs98",
"lightBulbs96",
"lightBulbs91",
"lightBulbs95"
]
}
aws iot list-things-in-thing-group --thing-group-name firstFloor
{
"things": [
"lightBulbs53",
"lightBulbs51",
"lightBulbs57",
"lightBulbs52",
"lightBulbs58",
"lightBulbs55",
"lightBulbs54",
"lightBulbs56",
"lightBulbs59",
"lightBulbs50"
]
}
関連する請求グループの作成
請求グループは、AWS IoTで課金するための基本単位です。モノのグループの一部であるかどうかに関係なく、モノに対して個別に請求グループを割り当てることができます。
この例では、ExampleCorpは、フロア内のすべてのモノに対して、建物のフロアごとに1つの請求グループを作成することを決定します。
次のコマンドは、Building2の1階にあるモノの請求グループを作成し、このグループにタグを自動的に追加して、その場所を特定します。
aws iot create-billing-group --billing-group-name Building2FirstFloorLightBulbs --tags Key="Location",Value="Building2-FirstFloor"
{
"billingGroupArn": "arn:aws:iot:us-east-1:453102091241:billinggroup/Building2FirstFloorLightBulbs",
"billingGroupId": "af885c88-15b2-4f3d-8809-287e07c56338",
"billingGroupName": "Building2FirstFloorLightBulbs
}
可能であれば、モノの作成時に請求グループにモノを割り当てることをお勧めします。これが不可能な場合は、請求グループに個別にモノを追加する必要があります。
この例では、ExampleCorpはエリアごとに作成された請求グループにモノを割り当てます。次のCLIコマンドは、既存の請求グループに個別にモノを追加する方法を示しています。
# add one thing to billing group
aws iot add-thing-to-billing-group --billing-group-name Building2FirstFloorLightBulbs --thing-name lightBulbs53
建物のエリアを顧客に賃貸する場合、請求グループに顧客の名前をタグ付けできます。
たとえば、AnyCompany2がBuilding2の1階を借りる場合、この請求グループに特定のタグcustomerName = AnyCompany2のタグを付けることができます。
これで、以前に作成した請求グループに適切な顧客名(AnyCompany2)のタグが付けられます。
aws resourcegroupstaggingapi tag-resources --resource-arn-list arn:aws:iot:us-east-1:453102091241:billinggroup/Building2FirstFloorLightBulbs --tags "customerName"="AnyCompany2"
{
"FailedResourcesMap": {}
}
上記のコマンドは、請求グループにタグを正常に追加しました。AWS IoT Coreコンソールで請求グループを表示するには、管理、請求グループを選択し、表示する請求グループを選択します。
同様のタグをIoT以外のリソースに使用して、コスト割り当てタグの一部にすることができます。有効にすると、コスト割り当てタグは、AWS予算の基準を改善するためだけでなく、コストエクスプローラーでグループ化およびフィルタリングの要素として使用できます。
IAMポリシーでタグを使用する例
タグのもう1つの一般的な使用法は、詳細に設定可能なIAMポリシーのセットを作ることです。
次のポリシーは、特定のテナント(この例ではAnyCompany2など)に関連するユーザーにアタッチして、デバイスシャドウを更新できるようにすることができます。これは、プリンシパル(ユーザー)とリソースの両方に同じcustomerNameタグ(AnyCompany2)があることを確認することで実現されます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:UpdateThingShadow",
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/customerName": "${aws:PrincipalTag/customerName}"
}
}
}
]
}
タグ付けは、テナントのセキュリティに不可欠です。ポリシーにより、権限のないユーザーがタグを操作するのを防ぎ、リソースに設定したりAWSコマンドに渡したりすることができるタグのキーと値を制限できます。詳細については、属性ベースのアクセス制御のタグの使用に関するチュートリアルを参照してください。
結論
この投稿では、マルチテナントのユースケースを順を追って説明し、タグ付けによって次の機能がどのように向上するかを説明しました。
- テナントに応じたリソースの管理性
- 正確なテナント請求書による請求
- タグチェックに基づいて、テナントによるきめ細かな制御を可能にするセキュリティポリシー
これで、独自のタグ付け戦略を定義して、AWS IoTリソースの管理とセキュリティを改善する準備ができました。
原文はこちら。
翻訳はソリューションアーキテクト 三平が担当しました。