AWS IoT Greengrassのパブリックコンポーネントが配置されているS3バケットのDNS名を取得してみた
はじめに
AWS IoT Greengrass(以下Greengrass)をファイアウォールで通信制御している環境で利用する場合、許可するドメイン名を明示的に指定する必要があります。
カスタムコンポーネントであれば自身で作成したS3バケットのドメイン名を指定すればよいのですが、パブリックコンポーネントの場合はAWSが管理するS3バケットからコンポーネントを取得するため、そのバケットのDNS名を事前に調べる必要があります。
以前に書いた以下の記事でGreengrass Core デバイスにパブリックコンポーネントをデプロイする際の宛先エンドポイントを監視しました。
デプロイの際にドキュメントには記載のないエンドポイントからコンポーネントをダウンロードしていることが分かりました。
そこで今回はAWS CLIを使ってパブリックコンポーネントが配置されているS3バケットのDNS名を事前に把握しておく方法を試してみます。
全体の流れ
手順は以下の3ステップです。
- コンポーネントのARN取得
- コンポーネントのURI取得
- S3バケットのDNS名取得
それでは順番にやっていきましょう。
前提として、以下は全てCloudShellから実行しています。
1. コンポーネントのARN取得
まずはコンポーネント名を指定してARNを取得します。
今回はaws.greengrass.StreamManagerを例に解説しますが、適宜インストールするコンポーネントの名前に置き換えてください。
aws greengrassv2 list-components \
--scope PUBLIC \
--region ap-northeast-1 \
--query "components[?componentName=='aws.greengrass.StreamManager']" \
--output json | jq -r '.[0].latestVersion.arn'
出力例
arn:aws:greengrass:ap-northeast-1:aws:components:aws.greengrass.StreamManager:versions:2.2.1
出力されたARNを控えておきます。
ここでは最新バージョンのARNが出力されますが、過去バージョンが必要な場合は末尾のバージョン番号を変更してください。
2. コンポーネントのURI取得
控えておいたARNを使ってコンポーネントのレシピを取得し、そこからアーティファクトのURIを抜き出します。
| 項目 | 値 |
|---|---|
| --arn | 手順1で取得したARN |
aws greengrassv2 get-component \
--arn "arn:aws:greengrass:ap-northeast-1:aws:components:aws.greengrass.StreamManager:versions:2.2.1" \
--region ap-northeast-1 \
--query recipe \
--output text | base64 --decode | jq '.Manifests[].Artifacts[].Uri'
URIが複数出力されます。
"greengrass:PC5xX4YZTCG8uIyOOzJrVxBsa6MeqnH7JGw33kMAKoc=/AWSGreengrassGreenlake-1.0-super.jar"
"greengrass:UIC28_7h_gBh4gliWE5xwUBqCzUr1SzHM7tBKqyA-yY=/aws-iot-device-sdk.jar"
一番上の行のgreengrass:以降の部分を控えておきます。
上記の例ではPC5xX4YZTCG8uIyOOzJrVxBsa6MeqnH7JGw33kMAKoc=/AWSGreengrassGreenlake-1.0-super.jarの部分です。
3. S3バケットのDNS名取得
最後にコンポーネントが配置されたS3バケットの署名付きURLを取得して、そこからバケットのDNS名を抜き出します。
| 項目 | 値 |
|---|---|
| --arn | 手順1で取得したARN |
| --artifact-name | 手順2で取得したURI |
aws greengrassv2 get-component-version-artifact \
--arn "arn:aws:greengrass:ap-northeast-1:aws:components:aws.greengrass.StreamManager:versions:2.2.1" \
--artifact-name "PC5xX4YZTCG8uIyOOzJrVxBsa6MeqnH7JGw33kMAKoc=/AWSGreengrassGreenlake-1.0-super.jar" \
--region ap-northeast-1 \
--query preSignedUrl \
--output text
次のような署名付きURLが出力されます。
https://evergreencomponentmanageme-artifactbucket7410c9ef-x81b4h9rizzn.s3.ap-northeast-1.amazonaws.com/public/aws.greengrass.StreamManager/2.2.1/s3/ggv2-component-releases-prod-nrt/SM-EXE/.../AWSGreengrassGreenlake-1.0-super.jar?X-Amz-Security-Token=...&X-Amz-Algorithm=...
出力結果からhttps://の後にあるS3バケットのDNS名を抜き出します。
上記の例では以下の部分です。
evergreencomponentmanageme-artifactbucket7410c9ef-x81b4h9rizzn.s3.ap-northeast-1.amazonaws.com
取得したDNS名をファイアウォールの許可リストに追加してください。
この一連の操作を利用するパブリックコンポーネントごとに実施してください。
他のコンポーネントでも同じDNS名なのか確認してみた
コンポーネントごとにS3バケットが異なる可能性もあるため、別のコンポーネントや古いバージョンでも同じ手順を実施して確認してみました。
| コンポーネント | バージョン | S3バケットのDNS名 |
|---|---|---|
| aws.greengrass.StreamManager | 2.2.1 | evergreencomponentmanageme-artifactbucket7410c9ef-x81b4h9rizzn.s3.ap-northeast-1.amazonaws.com |
| aws.greengrass.StreamManager | 2.1.13 | evergreencomponentmanageme-artifactbucket7410c9ef-x81b4h9rizzn.s3.ap-northeast-1.amazonaws.com |
| aws.greengrass.LogManager | 2.3.11 | evergreencomponentmanageme-artifactbucket7410c9ef-x81b4h9rizzn.s3.ap-northeast-1.amazonaws.com |
結果として、異なるコンポーネント(LogManager)でも、古いバージョンのStreamManager(2.1.13)でも、すべて同じS3バケットのDNS名でした。
現時点では東京リージョンのパブリックコンポーネントは共通のS3バケットに配置されているようです。
まとめ
今回はパブリックコンポーネントが置かれたS3バケットのDNS名を取得してみました。
ファイアウォールでドメイン名を明示的に指定する必要がある環境ではこのDNS名を事前にファイアウォールの許可リストに追加しておく必要があります。
ワイルドカードが使えない環境では、利用するパブリックコンポーネントごとにこの手順を実施してDNS名を確認しておきましょう。
過去バージョンのコンポーネントや別のコンポーネントも同じS3バケットに置かれていることから今後も同じS3バケットに置かれる可能性は高そうですが、ドキュメントに明示的にS3バケットが書かれている訳ではないので、定期的に確認するのが安全かと思います。






