[AWS IoT Greengrass V2] トークン交換サービスでコンポーネントからDynamoDBにアクセスしてみました

2021.08.30

1 はじめに

IoT事業部の平内(SIN)です。

AWS IoT Greengrass V2では、AWSから提供されるいくつかの事前構築済みコンポーネントがありますが、その中のトークン交換サービスコンポーネント (aws.greengrass.TokenExchangeService) を使用すると、ロールエリアス経由で指定されたロールに基づき、AWSのリソースへのアクセスが可能になります。

今回作成したサンプルのコンポーネントは、起動時にDynamoDBに現在時間を書き込みます。 下記は、それを実行して動作確認している様子です。

左上は、ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)の画面、右上はDynamoDBのコンソール、下は、作成したコンポーネントのログをtailしている画面です。

ローカルデバッグコンソールでコンポネントを再起動するために、DynamoDBのデータが増えていっている様子が確認できます。

2 コンポーネントのコード

作成したコンポーネントのコードは、以下のとおりです。

起動時にDynamoDBに現在時間を追加していますが、ロールにアクセス権が付与されたLambdaのコードのように、特に権限を気にすることなく、boto3.resource() で生成したオブジェクトでそのままアクセスできています。

token_exchange_sample.py

import boto3
import datetime

timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('TokenExchangeSampleDb')
response = table.put_item(
    Item = {
        'timestamp': timestamp
    }
)
print(response)

3 レシピ

レシピでは、ComponentDependenciesで、aws.greengrass.TokenExchangeServiceの依存関係が定義されています。

---
RecipeFormatVersion: "2020-01-25"
ComponentName: "com.example.TokenExchangeSample"
ComponentVersion: "1.1.0"
ComponentType: "aws.greengrass.generic"
ComponentDependencies:
  aws.greengrass.TokenExchangeService:
    VersionRequirement: ">=2.0.0 <3.0.0"
    DependencyType: "HARD"
Manifests:
- Platform:
    os: "linux"
  Name: "Linux"
  Lifecycle:
    Install: "pip3 install --user boto3"
    Run: "python3 {artifacts:path}/token_exchange_sample.py"
  Artifacts:
  - Uri: "s3://gg-artifacts-2021-08-11/artifacts/com.example.TokenExchangeSample/1.0.0/token_exchange_sample.py"
    Digest: "q95KhB1LWZLifeYzkM7NSyy+6tU76N2T960kmBwRj1Y="
    Algorithm: "SHA-256"
    Unarchive: "NONE"
    Permission:
      Read: "OWNER"
      Execute: "NONE"
Lifecycle: {}

デプロイが完了すると、作成したコンポーネント(com.example.TokenExchangeSample)とトークン交換サービスコンポーネント (aws.greengrass.TokenExchangeService) が確認できます。

$ sudo /greengrass/v2/bin/greengrass-cli component list
・・・略・・・
Component Name: aws.greengrass.TokenExchangeService
    Version: 0.0.0
    State: RUNNING
    Configuration: {"port":0.0}
Component Name: com.example.TokenExchangeSample
    Version: 1.1.0
    State: FINISHED
    Configuration: {}
・・・略・・・

4 パーミッション

DynamoDBへデータを追加する権限は、下記のロールをGreengrassV2TokenExchangeRoleに追加することで付与されています。

TokenExchangeSampleRole

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:ap-northeast-1:*:table/TokenExchangeSampleDb"
        }
    ]
}

5 最後に

今回は、トークン交換サービスコンポーネント (aws.greengrass.TokenExchangeService) を使用して、コンポーネントからAWSのリソースへアクセスしてみました。

内部で使われてるのは、Authorizing Direct Callsですが、コンポーネントの実装では、STSの処理などは一切必要ないので、非常に簡単に利用できます。

参考:[AWS IoT] 既存の証明書だけでMQTT以外の各種AWSリソ−スにアクセスする (Authorizing Direct Calls)

6 参考リンク


[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました
[AWS IoT Greengrass V2] コンポーネントでコアデバイス間のPublish/Subscribeを試してみました
[AWS IoT Greengrass V2] ログマネージャでコンポーネントのログをCloudWatch Logsに送ってみました