Introduction
この記事では、キャッシュサービスのMomentoを
Rustから使ってみました。
後半部分でAWS Lambdaから使っているのですが、
↑の書き方だとプログラムにMemontoのトークンが直接記述されています。
これはあまりよろしくなので、ここにあるように、
AWS Secrets Managerをつかって、トークンを取得するように修正します。
Environment
- OS : MacOS 12.4
- rust : 1.61.0
M1 Macで動かしました。
AWSアカウントはセットアップ済みとします。
また、以前の記事で作成した
momento-lambdaプロジェクトを元に解説します。
Use Momento with AWS Secrets Manager
momento-lambda/src/main.rsで直接Momentoのトークンを記述しているので、
AWS Secrets Managerで管理するように変更しましょう。
AWS Secrets Manager設定
コンソールでAWS Secrets Managerを開きます。
「新しいシークレットを保存する」を押し、「その他のシークレットのタイプ」を選択します。
キー/値のペアのところで、キーは「MOMENTO_AUTH_TOKEN」を記述。
値はMomentoのトークンを記述します。
次の画面へいき、名前に「accounts/MomentoAuthToken」を入力します。
シークレットローテーションを処理は設定せず、
最終確認をして保存します。
なお、ここで各言語のサンプルコードをみることができます。
(Rustはないですが)
プログラム修正
次はプログラムの修正です。
ここを参考に実装していきましょう。
Cargo.tomlのdependenciesに必要なcrateを追加します。
aws-config = "0.15.0"
aws-sdk-secretsmanager = "0.15.0"
serde_json = "1.0.82"
そしてmain.rsの修正。
必要なライブラリのimportとさっき登録したシークレットの名前、
あとはSecrets Managerのリージョンを定義しておきます。
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_secretsmanager::{Client, Error as AwsError, Region, PKG_VERSION};
use serde_json::{Result as JsonResult, Value};
const MOMENTO_SECRET_ID: &str = "accounts/MomentoAuthToken";
const SECRET_REGION:&str ="ap-northeast-1";
そしてSecrets Managerからトークンを取得する関数と、
それを元にSimpleCacheClientを作成する関数を定義。
(エラー処理はかなり適当)
async fn init_client() -> Result<SimpleCacheClient,Error> {
let auth_token = get_momento_auth_token().await?;
let item_default_ttl_seconds = 60;
return Ok(SimpleCacheClientBuilder::new(
auth_token,
NonZeroU64::new(item_default_ttl_seconds).unwrap(),
)?.build());
}
async fn get_momento_auth_token() -> Result<String,Error> {
let shared_config = aws_config::from_env().region(Region::new(SECRET_REGION)).load().await;
let client = Client::new(&shared_config);
let resp = client.get_secret_value().secret_id(MOMENTO_SECRET_ID).send().await?;
let json = resp.secret_string().unwrap_or("No value!").to_string();
let v: Value = serde_json::from_str(&json)?;
return Ok(v["MOMENTO_AUTH_TOKEN"].as_str().unwrap().to_string() );
}
あとはfunction_handlerでinit_client関数を実行し、
Momentoのクライアントを取得します。
let mut cache_client = init_client().await?;
取得後の使い方は以前とまったく同じです。
これでトークンをプログラムに埋め込まず、
Momenotoへのアクセスを安全に行えるようになりました。