Greengrass Development Kit CLI(GDK CLI)の新バージョン v1.1.0 を試してみた

GDK CLI はいいぞ。
2022.04.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以前「Greengrass Development Kit CLI」をご紹介したことがありますが、この記事を書いたすぐ後に新バージョンが出ていました。

GitHub のリポジトリも特に Watch しておらず約 2 ヶ月遅れで気がついたのですが、今回簡単に触ってみたので紹介したいと思います。

変更点

今回のリリースでは 次の 5 つの新機能といくつかのバグの修正と改善が行われました。

  1. Gradle によるビルドシステムのサポート
  2. Windows デバイスでの Maven によるビルドシステムのサポート
  3. --bucketオプションの追加
    • GDK CLI がアーティファクトをアップロードする S3 バケットを指定可能になりました。
  4. --nameオプションの追加
    • GDK CLI で初期化するディレクトリを指定可能になりました。
  5. S3バケットには存在するが、ローカルコンポーネントビルドフォルダーには存在しないコンポーネントアーティファクトのサポートを追加

また今回のバージョンから Python のバージョン要件が 3.8 から 3.6 に下がりました。

新機能を試す

今回は 5 つの新機能のうち、新たに追加されたオプションを試してみたいと思います。

GDK CLI のバージョンアップ

試す前に、GDK CLI をバージョンアップしておきましょう。
現在は、1.0.0がインストールされています。

$ gdk --version
gdk 1.0.0

下記のコマンドでバージョンを指定してアップデートします。

$ python3 -m pip install -U git+https://github.com/aws-greengrass/aws-greengrass-gdk-cli.git@v1.1.0

最新バージョンになりました。

$ gdk --version                                                                 
gdk 1.1.0

--name オプションを試す

これまでは、事前に作業ディレクトリを作成しておく必要がありましたが、初期化の際に--nameオプションを付けることで、自動的に指定ディレクトリが作成されて初期化までできるようになりました。

$ gdk component init \
  -l python \
  --name MyTest \
  -t HelloWorld

これで Python のHelloWorldテンプレートを使ってディレクトリが初期化されました。

なお、ビルド時にこのディレクトリ名でアーティファクトが作成される点は変わりません。
(ビルドシステムに zip を指定していれば、MyTest.zipというアーティファクトがローカルに作成されます。)

ビルド準備

コンポーネントをビルドするために、前回の記事のように各ファイルを編集していきます。

gdk-config.json の編集

下記の内容に編集します。

gdk-config.json

{
  "component": {
    "com.example.MyTest": {
      "author": "CM-ICHIDA",
      "version": "NEXT_PATCH",
      "build": {
        "build_system": "zip"
      },
      "publish": {
        "bucket": "gdk-mytest",
        "region": "ap-northeast-1"
      }
    }
  },
  "gdk_version": "1.0.0"
}

recipe.yaml の編集

レシピファイルも次のように修正します。
ArtifactsURIに指定するアーティファクトのファイル名は、後で実行するビルド作業時に生成されるファイル(MyTest.zip)に合わせておきましょう。

recipe.yaml

---
RecipeFormatVersion: "2020-01-25"
ComponentName: "{COMPONENT_NAME}"
ComponentVersion: "{COMPONENT_VERSION}"
ComponentDescription: "This is GDK v1.1.0 Test component written in Python."
ComponentPublisher: "{COMPONENT_AUTHOR}"
ComponentConfiguration:
  DefaultConfiguration:
    Message: "GDK v1.1.0"
Manifests:
  - Platform:
      os: all
    Artifacts:
      - URI: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/MyTest.zip"
        Unarchive: ZIP
    Lifecycle:
      Run: "python3 -u {artifacts:decompressedPath}/MyTest/main.py {configuration:/Message}"

main.py の編集

既存のままでもいいですが、前回同様に次のような内容にしました。

main.py

import sys
import datetime
import time

message = "Hello, %s! Current time: %s." % (sys.argv[1], datetime.datetime.now())

while(True):
    # Print the message to stdout.
    print(message)

    # Append the message to the log file.
    with open('/tmp/Greengrass_MyTest.log', 'a') as f:
        print(message, file=f)
    time.sleep(5)

build

準備ができたのでビルドします。

$ gdk component build

publish で--bucket オプションを試す

これまではgdk-config.jsonで S3バケットを指定すると、次のような書式の名前で S3 バケットが作成されて、アーティファクトがアップロードされていました。
(「バケットプレフィックス」と「リージョン」はgdk-config.jsonで定義したものになります。)

[バケットプレフィックス]-[リージョン]-[アカウントID]

今回の--bucketオプションで S3 バケットを指定すると、指定した名前の通りのバケットが作成されるので、これまでのような「リージョン」や「アカウントID」などが入らないバケット名で作成されます。

(S3 バケットは全アカウントで一意である必要があるので、以前よりも一意性に留意した名前を付けるよう気をつける必要はあります)

では--bucketオプションを使って publish してみましょう。
試しにdetarame(でたらめ)という名前のバケットを指定してみたいと思います。

$ gdk component publish --bucket detarame

ログに下記のようなメッセージが出ており、オプションで指定した名前の S3 バケットが作成されていました。

[2022-04-14 15:18:00] INFO - Successfully created the artifacts bucket 'detarame' in region 'ap-northeast-1'

S3 のコンソールでもdetarameバケットが作成されていて、アーティファクトがアップロードされていることが確認できました。

01-detarame-s3

Greengrass V2 のコンソールでもコンポーネントが作成されていることが確認できました。

02-component-mytest

また、この画面の一番下にあるアーティファクトの表示でも、対象のバケットdetaremeにあるアーティファクトが参照されていることが分かります。

03-describe-greengrass-component-artifact

なお、--bucketオプションを指定しなければ従来のようにgdk-config.jsonの設定に基づいた下記のようなバケット名が作成されます。

[バケットプレフィックス]-[リージョン]-[アカウントID]

今回のgdk-config.jsonの内容であれば、gdk-mytest-ap-northeast-1-123456789123といったバケットが作成されます。
なお、--bucketオプションを指定した場合はオプションが優先されるので、gdk-config.jsonで指定したバケット名は使われません。

また、デフォルトでは GDK CLI で作成される S3 バケットは、下記の画像のように「パブリックアクセスのブロック」が無効になっているので必要に応じて変更して下さい。
「パブリックアクセスのブロック」が有効でも Greengrass へのコンポーネント登録や、デバイスへのコンポーネントのデプロイに影響はありません。

04-s3-public-access-default

最後に

軽微なアップデートですが、バケット名が指定できるようになったのでコンポーネント作成の CI/CD のパイプライン設定が少し楽になったのではないかと思っています。
この点については、改めて検証してみたいと思います。

以上です。