Dapr 入門チュートリアル: キーストレージ

Dapr 入門チュートリアル: キーストレージ

アプリケーションは通常、専用のシークレット ストアを使用して、キーやトークン、データベース、サービス、外部システムでの認証に使用されるシークレットなどの機密情報を保存します。通常、これには​Azure Key Vault​​Hashicorp Vault​などのシークレット ストアを設定し、そこにアプリケーション レベルのプライベート データを保存することが含まれます。これらのシークレット ストアにアクセスするには、アプリケーションはシークレット ストアの SDK をインポートし、それを使用してプライベート データにアクセスする必要があります。これには、アプリケーションの実際のビジネス ドメインに関連しない大量のコードが必要になる可能性があるため、異なるベンダー固有のシークレット ストアを使用する可能性のあるマルチクラウド シナリオでは、これが大きな課題になります。

開発者がアプリケーションのプライベート データを簡単に使用できるようにするために、Dapr には専用の Secret ビルディング ブロック API があり、開発者はこれを使用して Secret ストレージからプライベート データを取得できます。 Dapr の Secret ストレージ ビルディング ブロックを使用するには、通常、次の手順に従います。

  • 特定のシークレット ストレージ ソリューション用のコンポーネントを設定します。
  • アプリケーション コードで Dapr の Secret API を使用して、秘密データを取得します。
  • (オプション) Dapr コンポーネント ファイル内のシークレットを参照します。

デフォルトでは、Dapr は、Helm または dapr init -k を介して Kubernetes モードでデプロイされると、組み込みの Kubernetes Secret ストアを有効にします。別のシークレット ストアを使用する場合は、disable-builtin-k8s-secret-store 設定を使用して Dapr Kubernetes シークレット ストアを無効にすることができます。

アプリケーション コードは、Secret ビルディング ブロック API を呼び出して、コード内で使用できる Dapr 対応の Secret ストアからプライベート データを取得できます。たとえば、次の図は、構成されたクラウド シークレット ストア内の vault という名前のシークレット ストアから mysecret という名前のシークレット データを要求するアプリケーションを示しています。

ダプルシークレット

アプリケーションは、シークレット API を使用して、Kubernetes シークレット ストアからプライベート データにアクセスできます。次の例では、アプリケーションは Kubernetes Secret ストアから同じ mysecret を取得します。

K8s の Dapr シークレット

ローカル環境でのシークレットの使用

ここでも、説明のためにクイックスタート リポジトリを使用します。

 gitクローン [-b <dapr_version_tag>] https://github.com/dapr/quickstarts.git
cdクイックスタート

次に、secretstore ディレクトリの下のノード フォルダーを見つけます。

 $ cdチュートリアル/シークレットストア/ノード

app.js は、いくつかのルートとハンドラーを公開するシンプルな Express アプリケーションです。まず、ファイル内の次の内容を確認します。

定数 daprPort = process.env.DAPR_HTTP_PORT || 3500 ;
const secretStoreName = process.env.SECRET_STORE;
const secretName = "mysecret" ;

secretStoreName は環境変数 SECRET_STORE から読み取られ、Kubernetes デプロイメントの場合は値 kubernetes が挿入されます。ローカル開発の場合、環境変数を localsecretstore の値に設定する必要があります。

次に、getsecret ハンドラー コードを見てみましょう。

 app.get( "/getsecret" , (_req, res) = > {
const url = ` ${secretsUrl} / ${secretStoreName} / ${secretName} ?metadata.namespace=default` ;
console.log( "URL を取得中: %s" , url);
フェッチ(url)
.then((res) = > res.json())
.then((json) = > {
secretBuffer = new Buffer(json[ "mysecret" ]); を作成します。
エンコードされたSecret secretBuffer.toString( "base64" )とします。
console.log( "Base64 でエンコードされたシークレットは: %s" , encodingSecret);
res.send(encodedSecret) を返します。
});
});

このコードは、シークレット ストアから mysecret という名前のデータを取得し、そのデータの Base64 エンコード バージョンを表示します。

secrets.json ファイルに mysecret という名前の Secret データを追加します。

 {
「私の秘密」 : 「abcd」
}

また、Secret に対応する Component コンポーネントを追加する必要があります。たとえば、ローカル自己拡張管理モードでは、次のように構成ファイルを作成します。

 APIバージョン: dapr.io/v1alpha1
種類: コンポーネント
メタデータ:
名前: localsecretstore
名前空間: デフォルト
仕様:
タイプ: secretstores.local.file
バージョン: v1
メタデータ:
-名前: secretsFile
値: secrets.json
-名前: ネストされたセパレータ
価値: ":"

上記のコンポーネントは、シークレット ファイル パスが secrets.json ファイルであるローカル シークレット リポジトリを定義します。

Secret が JSON を保存するパスは、dapr run を呼び出す場所を基準とします。

次に、上記のシークレット ストア名を環境変数として設定する必要があります。

 エクスポートSECRET_STORE = "localsecretstore"
SECRET_STORE = localsecretstore を設定します

次に、Node アプリケーションの依存関係をインストールします。

 npmインストール

次に、Dapr を使用して、ローカル シークレット ストア コンポーネントを含む Node アプリケーションを実行します。

 $ dapr実行--app -id nodeapp --components -path ./components --app -port 3000 --dapr -http -port 3500 ノードapp.js
ℹ️ ID nodeapp で Dapr を起動しています。 HTTP ポート: 3500 。 gRPC ポート: 58744
INFO[0000] Dapr Runtime を開始--バージョン1 .8.4 --コミット 18575823c74318c811d6cd6f57ffac76d5debe93 app_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ= log ver = 1 .8.4

INFO[0000]コンポーネントがロードされました。名前: localsecretstore、タイプ: secretstores.local.file/v1 app_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ= log バージョン= 1 .8.4
INFO[0000] 未処理のコンポーネントがすべて処理されましたapp_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ= log バージョン= 1 .8.4

= = APP = = Node App はポート3000でリッスンしています。
INFO[0000] ポート3000でアプリケーションが検出されましたapp_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ= log バージョン= 1.8.4
警告[0000] [非推奨の通知] 受信サービス呼び出し要求にデフォルトのコンテンツ タイプを追加することは非推奨であり、 将来削除される予定です。詳細については、https://docs.dapr.io/operations/support/support-preview-features/ を参照してください。構成オプション`ServiceInvocation.NoDefaultContentType`trueに設定することで、今すぐ新しい動作を選択できます。 app_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ=ログバージョン= 1 .8.4
INFO[0000] アプリケーション構成がロードされましたapp_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ= log バージョン= 1 .8.4
INFO[0000] アクター: 状態ストアが構成されていません-クライアントの場合は問題ありませんが、ホストされたアクターを持つサービスは初期化に失敗します。 app_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ=ログバージョン= 1 .8.4
INFO[0000] アクターランタイムが開始されました。アクターのアイドルタイムアウト: 1時間0分0秒。アクタースキャン間隔: 30 秒app_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime.actor タイプ= log バージョン= 1 .8.4
INFO[0000] daprが初期化されました。ステータス: 実行中。初期化経過時間326 .570000000000005 ミリ秒app_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime タイプ= log バージョン= 1 .8.4
INFO[0000] 配置テーブルが更新されました。バージョン: 0 app_id = nodeapp インスタンス= MBP2022.local スコープ= dapr.runtime.actor.internal.placement タイプ= log バージョン= 1 .8.4
ℹ️ アプリメタデータを更新するコマンド: node app.js
起動して実行中です! Dapr とアプリのログの両方がここに表示されます。

起動後、dapr list を使用してアプリケーション リストを表示できます。

 $ daprリスト
アプリケーション ID HTTP ポート GRPC ポート アプリケーション ポート コマンド 作成日 PID
ノードアプリ3500 58744 3000 ノードアプリ.js 11分2022-09-27 15 : 13.46 5906

起動が完了すると、アプリケーションの getsecret インターフェースに直接アクセスできるようになります。

 $ curl -k http://localhost:3000/getsecret

通常の出力結果は YWJjZA== で、これは上記の abcd を base64 エンコードした後の値です。

次に、アプリケーション ログを確認すると、次のような内容が表示されます。

 = = APP = = URL を取得しています: http://localhost:3500/v1.0/secrets/localsecretstore/mysecret?metadata .namespace = default
= = APP = = Base64でエンコードされたシークレットは: YWJjZA = =

テストが完了したら、dapr stop コマンドを使用してアプリケーションを停止できます。

 dapr を停止--app -id nodeapp

Kubernetes 環境でのシークレットの使用

次に、Dapr が Kubernetes モードで Secrets ストアをどのように使用するかを見てみましょう。もちろん、まず Kubernetes クラスターに Dapr コントロール プレーンをインストールする必要があります。

Dapr は、AWS Secret Manager、Azure Key Vault、GCP Secret Manager、Kubernetes など、さまざまなシークレット ストアを使用してシークレット データを解析できます。ここでは、Kubernetes Secret オブジェクトを直接使用してデモンストレーションを行うことができます。

まず、シークレット データを ./mysecret ファイルに追加します。たとえば、パスワードが abcd の場合、./mysecret ファイルの内容は abcd になります。

次に、./mysecret ファイルに基づいて Kubernetes Secret オブジェクトを作成します。

 $ kubectlシークレットジェネリック mysecret を作成します--from -file ./mysecret

作成された Secret オブジェクトの名前 mysecret をメモします。これは後ほど使用されます。

作成が完了したら、オブジェクト内のデータが期待どおりかどうかを確認できます。

 $ kubectlシークレット mysecret -o yaml を取得します
APIバージョン: v1
データ:
私の秘密: YWJjZAo =
種類: 秘密
メタデータ:
作成タイムスタンプ: "2022-09-27T07:34:31Z"
名前: mysecret
名前空間: デフォルト
リソースバージョン: "5133821"
uid: c9aa573c-5f71-439c-b482-748ac0fe3ae7
タイプ: 不透明

次に、Node.js アプリケーションを Kubernetes クラスターにデプロイします。対応するリソース マニフェスト ファイルは次のとおりです。

種類: サービス
APIバージョン: v1
メタデータ:
名前: ノードアプリ
ラベル:
アプリ: ノード
仕様:
セレクタ:
アプリ: ノード
ポート:
-プロトコル: TCP
ポート: 80
ターゲットポート: 3000
タイプ: ロードバランサー
-- -
APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
名前: ノードアプリ
ラベル:
アプリ: ノード
仕様:
セレクタ:
一致ラベル:
アプリ: ノード
テンプレート:
メタデータ:
ラベル:
アプリ: ノード
注釈:
dapr.io/有効: "true"
dapr.io/アプリID: "nodeapp"
dapr.io/アプリポート: "3000"
仕様:
コンテナ:
-名前: ノード
画像: ghcr.io/dapr/samples/secretstorenode:latest
環境:
-名前: SECRET_STORE
値: "kubernetes"
ポート:
-コンテナポート: 3000
imagePullPolicy: 常に

ここで重要な点は、環境変数 SECRET_STORE を構成し、その値を kubernetes に設定して、アプリケーションが Kubernetes を介して Secret データを取得する必要があることを認識できるようにすることです。アプリケーションをデプロイするだけです:

 $ kubectl apply -fデプロイ/node.yaml
$ kubectlポッドを取得する
名前 準備完了 ステータス 再起動 年齢
nodeapp-6cb5b689cf-vtn74 2 /2 実行中0 92
$ kubectl svc を取得します
名前 タイプ クラスター IP 外部 IP ポート 年齢
nodeapp ロードバランサー10 .101.216.73 192 .168.0.50 80 :32719/TCP 13d
nodeapp-dapr ClusterIP なし <なし> 80 /TCP、50001/TCP、50002/TCP、9090/TCP 13d

デプロイが完了すると、EXTERNAL-IP 192.168.0.50 を介してアプリケーションにアクセスできるようになります。

 カール-k http://192.168.0.50/getsecret

通常、上記のリクエストの出力は YWJjZAo= です。 Node アプリケーション ログを表示することもできます。

 $ kubectlログ--selector = app = node -c node
Node アプリはポート3000でリッスンしています。
URL を取得しています: http://localhost:3500/v1.0/secrets/kubernetes/mysecret?metadata .namespace = default
Base64でエンコードされたシークレットは次のとおりです: YWJjZAo =

上記のログから、Node アプリケーションがシークレット ストアからシークレット データを取得するために dapr に要求を行っていることがわかります。 mysecret は上記で作成した Secret オブジェクトの名前であることに注意してください。

もちろん、HashiCorp Vault などの別のシークレット ストアを使用している場合は、次のリソース リストに示すように、secretstores.hashicorp.vault タイプの対応するコンポーネントを作成する必要があります。

 APIバージョン: dapr.io/v1alpha1
種類: コンポーネント
メタデータ:
名前: 金庫
仕様:
タイプ: secretstores.hashicorp.vault
バージョン: v1
メタデータ:
-名前: vaultAddr
値: [vault_address]
-名前: caCert
値: "[ca_cert]"
-名前: caPath
値: "[path_to_ca_cert_file]"
-名前: caPem
値: "[encoded_ca_cert_pem]"
-名前: skipVerify
値: "[skip_tls_verification]"
-名前: tlsServerName
値: "[tls_config_server_name]"
-名前: vaultTokenMountPath
値: "[トークンを含むファイルへのパス]"
-名前: vaultToken
値: "[トークンを含むファイルへのパス]"
-名前: vaultKVPrefix
値: "[vault_prefix]"
-名前: vaultKVUsePrefix
値: "[true/false]"
-名前: エンジンパス
値: "秘密"
-名前: vaultValueType
値: "マップ"

Dapr でサポートされているその他のシークレット ストアの構成プロパティについては、関連情報の公式ドキュメント https://docs.dapr.io/reference/components-reference/supported-secret-stores/ を参照してください。

<<:  効果的なクラウド運用の5つの鍵

>>:  Kubernetes リソースを管理する際に注意すべき 5 つのポイント!

推薦する

入札プロモーションのクリエイティブ最適化戦略についての簡単な説明

キーワードによって、広告が表示される対象が決定されます。一方、創造性によって、潜在的な顧客が目にする...

張建福:「草の根版」馬化騰 ステーキはどのくらい焼きたいですか?

業界でのアー・フーの名声は、彼が作っている「ステーキ」という商品に影を落としている。ある意味で、彼は...

Baiduウェブマスターツールを使用して降格の問題を迅速に特定し解決する

ウェブサイトの降格は、多くのウェブマスターにとって常に頭痛の種でした。数年前、ウェブサイトが降格され...

IDC: 世界のパブリッククラウドサービス市場は2019年に前​​年比26%成長

IDC の最新レポートによると、2019 年の世界のパブリック クラウド サービス市場は総額 2,3...

ジュメイ・ユーピンは今夜ニューヨーク証券取引所に上場される。

新浪科技報5月16日、化粧品電子商取引サイトJumei Youpinは今夜、取引コード「JMEI」で...

中国初の独立した知的財産権を持つ新世代クラウド型クレジットカードコアビジネスシステム「スターカード」がオンラインになって1年が経った。

11月24日、中国中信銀行スターカード新コアシステム1周年記念サロンが深センで開催されました。このテ...

lisahost: クリスマス 10% オフ、米国 cn2 gia VPS、3 つのネットワーク必須、ネイティブ IP、1 日間の「トライアル」

Lisahostは、クリスマスに向けて、事前に米国cn2 gia vpsの10%割引を用意しました。...

検索エンジンを悪用するSEO担当者の4つのタイプの分析

自分のサイトが検索エンジンによってペナルティを受けたときは、まず自分のサイトがなぜペナルティを受けた...

yalo-$5/1g メモリ/200g ハードディスク/10T トラフィック/ノースカロライナ

yaloがホストキャットに登場するのは2回目。昨年設立され、openvz仮想化をベースにしている。最...

中小企業はまだSEO採用を行っていますか?プロセス全体をカバーするトップSEOソリューション

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています昨今、オン...

ウェブサイトの包含率を上げる5つの方法

記事の包含率は、ウェブサイトの成功にとって非常に重要です。私が従事している医療業界を例に挙げてみまし...

ケータリングアプリを使ってスタッフ全員でマーケティングを行う方法

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス【トータル従業員マーケテ...

インテルとトランスワープが協力し、ビッグデータ時代のオールフラッシュ分散データベースを構築

デジタル時代では、私たちのあらゆる動きや言葉が膨大な量のデータに変換されています。多くの人がこのよう...

企業ウェブサイトの高品質なコンテンツを更新する方法について簡単に説明します

企業ウェブサイトのコンテンツの更新については、SEO担当者なら誰でも頭を悩ませる問題だと思います。ウ...

テンセントは中小企業のデジタル変革を全面的にサポートする「デジタルクラウドエンタープライズ」エコロジカル協力活動を開始

11月6日、テンセントクラウドとエンタープライズWeChatは共同で「中小企業エコシステム協力記者会...