Dapr on Jetson Nano with k3s
庄司です。
マイクロサービスのように、多言語プログラミング (polyglot programming) が前提の環境では、認証認可やログのような横断的関心事 (cross-cutting concern) をアプリケーションのコードとして実装すると、各言語やフレームワークごとに移植が必要となり最新化への足かせとなります。
この記事では、分散アプリケーションランタイムの Dapr によって OpenID Connect の ID トークンの有効性の確認という横断的関心事の処理をアプリケーションコードの外側で実行するサンプルについて説明します。Jetson Nano のような IoT デバイス向けの Kubernetes としてフットプリントの軽い Rancher の K3S を利用します。
準備
#NVIDIA の Jetson Nano Developer Kit に K3S をインストールします。
その前に、まず 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.yaml
と dapr/deploy/exampleapp.yaml
を編集します。
パイプラインの定義
#まず、dapr
ディレクトリに移動します。
cd dapr
次に、oidc.yaml
と pipeline.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
で、NAME
が ingress-nginx-controller
、TYPE
が LoadBalancer
の行を探します。PORT(S)
の列で 80:<ポート番号>/TCP
となっている、ポート番号 (PORT NUMBER) を記録しておきます。
Amazon Cognito user pool の「ホストされた UI を起動」等でログイン画面を表示します。パラメータの response_type
を code
から 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 以外の言語による実装に切り替える場合には、検証や移植にコストがかかることを意味していました。
クラウドネイティブなアーキテクチャでは、この例のように実装言語に依存せず、ビジネス要件に集中することができるソリューションを活用していくことが可能となります。