AWS IoT TwinMaker Grafana ダッシュボード統合で必要な IAM 権限を整理してみた

2023.12.31

こんにちは、CX 事業本部 Delivery 部の若槻です。

AWS IoT TwinMaker では、Grafana dashboard integration(Grafana ダッシュボード統合) を構成することにより、IoT TwinMaker によるデジタルツインアプリケーションを Grafana ダッシュボード上で可視化することができます。

この機能を利用した下記のクッキー工場デモを実施した際に、Assume Role 用の IAM ロールを複数作成して使用する必要があり、若干の混乱をきたしました。

そこで今回は、AWS IoT TwinMaker Grafana ダッシュボード統合で必要な IAM 権限を整理してみました。

はじめにまとめ

AWS IoT TwinMaker でのデジタルツインによる可視化を行う上で、次の 3 つの IAM ロールが使用されます。

ロール 作成(指定)タイミング
1 AWS IoT TwinMaker ワークスペース実行ロール AWS IoT TwinMaker ワークスペース作成時(Workspace details Step)
2 Amazon Managed Grafana ワークスペース実行ロール Grafana ワークスペース作成時
3 Grafana ワークスペースの Dashborad ロール AWS IoT TwinMaker Workspace 作成時(Dashboard role Step) / Grafana ワークスペース Dashborad 設定時

AWS IoT TwinMaker ワークスペース実行ロール

AWS IoT TwinMaker では、サービスロールを使用してユーザーに代わって他のサービスのリソースにアクセスできるようにする必要があるので、AWS IoT TwinMaker ワークスペース実行ロール(Execution role)を作成します。

ロール作成(指定)

AWS IoT TwinMaker ワークスペース実行ロールは、TwinMaker ワークスペースを作成する際に指定が必要です。コンソールからワークスペースを作成する場合は、以下のように自動作成も可能です。

指定された IAM ロールは、マネジメントコンソールのワークスペースのトップから確認可能です。

ロールの信頼関係

AWS IoT TwinMaker ワークスペース実行ロールの信頼関係は、AWS IoT TwinMaker サービスがこの IAM ロールを引き受ける(assume)ことを許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "iottwinmaker.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

ロールのアクセス権限

AWS IoT TwinMaker では、ビルトインやカスタムの ComponentType を使用することにより、AWS 内外のサービスのリソースにアクセスしてデータを取得し、3D シーン上でコンテキストとして使用可能となります。

AWS IoT TwinMaker ワークスペース実行ロールの IAM Policy では、ComponentType がアクセスするサービスやリソースに応じて、AWS IoT TwinMaker サービスが使用する下記のようなアクセス権限を定義します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucket",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:ListObjects",
                "s3:ListObjectsV2",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::twinmaker-workspace-test-XXXXXXXXXXXX-iad/*",
                "arn:aws:s3:::twinmaker-workspace-test-XXXXXXXXXXXX-iad"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::twinmaker-workspace-test-XXXXXXXXXXXX-iad/DO_NOT_DELETE_WORKSPACE_*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:*:*:function:iottwinmaker-*"
        },
        {
            "Effect": "Allow",
            "Action": "kinesisvideo:DescribeStream",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iotsitewise:DescribeAssetModel",
                "iotsitewise:ListAssetModels",
                "iotsitewise:DescribeAsset",
                "iotsitewise:ListAssets",
                "iotsitewise:DescribeAssetProperty",
                "iotsitewise:GetAssetPropertyValue",
                "iotsitewise:GetAssetPropertyValueHistory"
            ],
            "Resource": "*"
        }
    ]
}

Amazon Managed Grafana ワークスペース実行ロール

Amazon Managed Grafana では、サービスロールを使用してユーザーに代わって他のサービスのリソースにアクセスできるようにする必要があるので、Amazon Managed Grafana ワークスペース実行ロール(Execution role)を作成します。このロールは Grafana ワークスペース作成時に自動作成されるものを使用するか、事前に作成したものを指定します。

AWS IoT TwinMaker Grafana dashboard integration を構成する場合においては、Grafana ワークスペースが AWS IoT TwinMaker などのリソースにアクセスできるようにする必要があるのですが、実際のリソースへのアクセス権限は後述の「Grafana ワークスペースの Dashborad ロール」を通じて付与するため、Grafana ワークスペース作成時に自動作成されるロールを使用することができます。

ロールの信頼関係

Grafana ワークスペース作成時に自動作成される IAM ロールの信頼関係は次のようになります。Amazon Managed Grafana のワークスペースがこの IAM ロールを引き受ける(assume)ことを許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "grafana.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "XXXXXXXXXXXX"
                },
                "StringLike": {
                    "aws:SourceArn": "arn:aws:grafana:us-east-1:XXXXXXXXXXXX:/workspaces/*"
                }
            }
        }
    ]
}

ロールのアクセス権限

そして先述した通り、自動作成される IAM ロールには IAM ポリシーによる権限付与はありません。

Grafana ワークスペース Dashborad ロール

AWS IoT TwinMaker Grafana dashboard integration において、Grafana ダッシュボードから AWS IoT TwinMaker をデータソースとして利用するためには、AWS IoT TwinMaker Application Plugin for Grafana を Grafana ダッシュボード側で構成する必要があります。

ロール作成

AWS IoT TwinMaker ワークスペース作成時または作成後に、Grafana ワークスペースの Dashborad ロールの作成手順が示されます。ポイントは飽くまで「示される」のみであり、AWS IoT TwinMaker ワークスペース側にこのロールを設定可能ですが、設定する必要はありません。

AWS IoT TwinMaker ワークスペースの作成時または作成後に、Dashboard settings メニューの「Dashboard management」ステップで、使用したい「AWS IoT TwinMaker ワークスペース実行ロール」を指定します。ここでこのロールは「Authentication provider」とも表されます。

すると次の「Dashboard role」ステップで、Grafana ワークスペースの Dashborad ロールの「アクセス権限」および「信頼関係」の定義が提示され、それを使用してロールを作成することができます。

作成をしたら、TwinMaker ワークスペースの Dashboard settings メニューに表示されるようになります。(下記では実際には作成していないので表示されていません)

しかし上記のメニュー上での表示はブラウザローカルに保存される情報であり、実際には AWS IoT TwinMaker ワークスペース側にこのロールを設定する必要はありません。ロールが実際に使用される Grafana ワークスペース Dashborad に指定されるまで一時的に表示されているのみです。

そしてもちろん Grafana ワークスペース Dashborad ロールの作成をここで行わずに、事前に作成しておいても構いません。

ロール指定

AWS IoT TwinMaker Application Plugin for Grafana のデータソースを設定する際に、先程までに作成した Grafana ワークスペース Dashborad ロールを指定します。

ロールの信頼関係

前述の Amazon Managed Grafana ワークスペース実行ロールがアクセス権限を引き受けることを許可するためのロールです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXXXX:role/service-role/AmazonGrafanaServiceRole-c1NwbxV2I"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

ロールのアクセス権限

Amazon Managed Grafana ワークスペース実行ロールが、AWS IoT TwinMaker などのリソースにアクセスするための権限を付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::twinmaker-workspace-cookiefactory-XXXXXXXXXXXX-iad",
                "arn:aws:s3:::twinmaker-workspace-cookiefactory-XXXXXXXXXXXX-iad/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iottwinmaker:Get*",
                "iottwinmaker:List*"
            ],
            "Resource": [
                "arn:aws:iottwinmaker:us-east-1:XXXXXXXXXXXX:workspace/CookieFactory",
                "arn:aws:iottwinmaker:us-east-1:XXXXXXXXXXXX:workspace/CookieFactory/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iottwinmaker:ListWorkspaces",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kinesisvideo:GetDataEndpoint",
                "kinesisvideo:GetHLSStreamingSessionURL"
            ],
            "Resource": [
                "arn:aws:kinesisvideo:us-east-1:XXXXXXXXXXXX:stream/cookiefactory_mixerroom_camera_01/*",
                "arn:aws:kinesisvideo:us-east-1:XXXXXXXXXXXX:stream/cookiefactory_mixerroom_camera_02/*"
            ]
        }
    ]
}

上記の通り AWS IoT SiteWise や Amazon S3 などへのアクセスは、AWS IoT TwinMaker を経由して行わるため、アクセス権限の直接付与は不要です。例外的に Amazon Kinesis Video Streams へのアクセスは、AWS IoT TwinMaker ではなく Grafana ワークスペースから直接行われます。このように、ComponentType を構成した AWS IoT TwinMaker ワークスペースでは、他サービスのリソースへのアクセスを簡易化することができます。

おわりに

AWS IoT TwinMaker Grafana ダッシュボード統合で必要な IAM 権限を整理してみました。

3 つの IAM ロールが関わって来る上に、ロールの作成や設定をするために各サービスの画面を行き来するので、どのロールがどんな役割を持っておりどこで設定をすべきか混乱してしまいがちだと思います。無用なトラブルを避けるためにも、各ロールの役割を理解しておくことが重要です。

以上