この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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に送ってみました