Dapr on Jetson Nano with k3s

| 4 min read
Author: shigeki-shoji

マイクロサービスのように、多言語プログラミング (polyglot programming) が前提の環境では、認証認可やログのような横断的関心事 (cross-cutting concern) をアプリケーションのコードとして実装すると、各言語やフレームワークごとに移植が必要となり最新化への足かせとなります。

この記事では、分散アプリケーションランタイムの Dapr によって OpenID Connect の ID トークンの有効性の確認という横断的関心事の処理をアプリケーションコードの外側で実行するサンプルについて説明します。Jetson Nano のような IoT デバイス向けの Kubernetes としてフットプリントの軽い Rancher の K3S を利用します。

準備#

NVIDIA の Jetson Nano Developer KitK3S をインストールします。

その前に、まず sudo 時にパスワードの入力が不要になるように、/etc/sudoers を編集しておくと良さそうです。 ユーザ名が user の場合は次の行を追加します:

user ALL=(ALL) NOPASSWD: ALL

K3S のインストール:

curl -sfL https://get.k3s.io | sh -

Dapr のインストール:

wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash

Helm のインストール:

curl https://helm.baltorepo.com/organization/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm --yes

Dapr の初期化を実行します:

dapr init -k

Nginx の Ingress コントローラを Helm チャートを使ってインストールします:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx

サンプルプロジェクトの取得#

Amazon Cognito user pool を使用して取得した ID トークンを検証するサンプルプロジェクトを GitHub からクローンします。

git clone https://github.com/edward-mamezou/oidc-filter.git

Amazon Cognito user pool の Issuer URL と クライアント ID#

Amazon Cognito user pool の Issuer URL はリージョン (REGION) と プール ID (POOL ID) から設定できます。

https://cognito-idp.<REGION>.amazonaws.com/<POOL ID>

クライアント ID は、アプリクライアント ID で表示されている値です。

この 2 つの値で、dapr/deploy/oidc.yamldapr/deploy/exampleapp.yaml を編集します。

パイプラインの定義#

まず、dapr ディレクトリに移動します。

cd dapr

次に、oidc.yamlpipeline.yaml を適用します。

kubectl apply -f deploy/oidc.yaml
kubectl apply -f deploy/pipeline.yaml

アプリケーションのデプロイ#

アプリケーションと Ingress ルールをデプロイします。

kubectl apply -f deploy/exampleapp.yaml
kubectl apply -f deploy/ingress.yaml

テスト#

kubectl get service で、NAMEingress-nginx-controllerTYPELoadBalancer の行を探します。PORT(S) の列で 80:<ポート番号>/TCP となっている、ポート番号 (PORT NUMBER) を記録しておきます。

Amazon Cognito user pool の「ホストされた UI を起動」等でログイン画面を表示します。パラメータの response_typecode から token に変更してログインすると、ブラウザの URL の id_token= に ID トークンの値が表示されますのでこれを記録しておきます (ID TOKEN)。

最後に以下の curl コマンドを実行して確認します。

curl -v -H 'Authorization: Bearer <ID TOKEN>' http://localhost:<PORT NUMBER>/v1.0/invoke/exampleapp/method/hello

まとめ#

これまで、横断的関心事は、例えば、Spring であれば Spring Security 等の依存ライブラリに組み込まれた AOP 実装を使用してきました。これを、他のフレームワークに切り替えたり、Java 以外の言語による実装に切り替える場合には、検証や移植にコストがかかることを意味していました。

クラウドネイティブなアーキテクチャでは、この例のように実装言語に依存せず、ビジネス要件に集中することができるソリューションを活用していくことが可能となります。

参考#