概要
Qiita 初投稿です。GCP の Secret Manager の指定したキーの値を Rust を用いて取得したい方向けの記事になります。
筆者は元々、Rust で立ち上げた個人プロジェクトの .env ファイルに APIキーなどの情報を入れていましたが、セキュリティの観点から Secret Manager に引っ越しすることになりました。
前提
- Rust がインストール済み。
- Google Cloud にプロジェクトが作成されている。
- サービスアカウントのキーの作成を既に行っており、json ファイルがダウンロード済み。
実装
「google_secretmanager1」クレートを利用するため、参考にした記事はこちらです。
https://docs.rs/google-secretmanager1/latest/google_secretmanager1/
今回の実装例では、MY_KEY の値を取得するサンプルになります。
.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 というキーの値がコンソール画面に表示されたら、無事成功となります。