0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Rust] Rust で Google の secret manager の値を取得する方法

Last updated at Posted at 2024-05-03

概要

Qiita 初投稿です。GCP の Secret Manager の指定したキーの値を Rust を用いて取得したい方向けの記事になります。

筆者は元々、Rust で立ち上げた個人プロジェクトの .env ファイルに APIキーなどの情報を入れていましたが、セキュリティの観点から Secret Manager に引っ越しすることになりました。

前提

  1. Rust がインストール済み。
  2. Google Cloud にプロジェクトが作成されている。
  3. サービスアカウントのキーの作成を既に行っており、json ファイルがダウンロード済み。

実装

「google_secretmanager1」クレートを利用するため、参考にした記事はこちらです。
https://docs.rs/google-secretmanager1/latest/google_secretmanager1/

今回の実装例では、MY_KEY の値を取得するサンプルになります。

image.png

.env

.env ファイルに下記を追加し、ご自身の環境に合わせます。

# minify したサービスアカウントのキーの json 
GOOGLE_APPLICATION_CREDENTIALS=
# Google Cloud のプロジェクトID 
PROJECT_ID=

Cargo.toml

[dependencies]
dotenvy = "0.15"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
google-authz = "0.0.2"
google-secretmanager1 = "*"
hyper = "1.3.1"
hyper-rustls = "0.27.1"

Secret Manager の指定したキーの値を取得する関数

get_secret_value 関数のパラメータには取得したいキーを入れます。

use std::env;
use secretmanager1::{
    SecretManager, oauth2, hyper, hyper_rustls, Error
};

// get_secret_value is a function that returns the secret value from the Secret Manager
pub async fn get_secret_value(secret_name: &str) -> Result<std::string::String, secretmanager1::Error> {
    let service_account_key = env::var("GOOGLE_APPLICATION_CREDENTIALS").unwrap();

    let service_account: oauth2::ServiceAccountKey = serde_json::from_str(&service_account_key).unwrap();

    let auth = oauth2::ServiceAccountAuthenticator::builder(service_account).build().await.unwrap();

    let hub = SecretManager::new(hyper::Client::builder().build(hyper_rustls::HttpsConnectorBuilder::new().with_native_roots().https_or_http().enable_http1().build()), auth);

    let project_id = env::var("PROJECT_ID").unwrap();

    let path = format!("projects/{}/secrets/{}/versions/latest", project_id, secret_name);

    let result = hub.projects().locations_secrets_versions_access(&path).doit().await;

    match result {
        Err(e) => match e {
             Error::HttpError(_)
            |Error::Io(_)
            |Error::MissingAPIKey
            |Error::MissingToken(_)
            |Error::Cancelled
            |Error::UploadSizeLimitExceeded(_, _)
            |Error::Failure(_)
            |Error::BadRequest(_)
            |Error::FieldClash(_)
            |Error::JsonDecodeError(_, _) => {
                println!("There was an error: {:?}", e);
                Err(e)
            }
        },
        Ok(res) => {
            let response = res.1;
            let value = response.payload.unwrap().data.unwrap();
            let secret_value = std::str::from_utf8(&value).unwrap();
            Ok(secret_value.to_string())
        }
    }

}

呼出側

let secret_value = get_secret_value("MY_KEY").await;
println!("{}", secret_value.unwrap());

実行の結果として、Google の Secret Manager にある MY_KEY というキーの値がコンソール画面に表示されたら、無事成功となります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?