🦀

Rust で AWS Systems Manager のパラメータストアからパラメータを取得する

2023/07/22に公開

Rust の Lambda 関数から api を叩きたいと思ったけれど、 api key とかをベタ書きする訳には行かないので、 AWS Systems Manager のパラメータストアを使うことにしました。

らしいです
例にもれずドキュメントAWS SDK for Rust API referenceを参考にやっていきます。

目標

  • Rust で構築した Lambda 関数上で AWS SDK for Rust を利用する
  • http リクエストの body から JSON パラメータを受け取る
  • パラメータストアからパラメータを取得する。
  • 取得したパラメータをそのまま返す
  • Lambda 関数の構築 は aws sam , cargo lambda を使って実施する

ライブラリの追加

今回必要なのはココらへん

  • aws-sdk-ssm : Systems Manager まわりの色々をやってくれる
  • aws-congfig : aws アカウント周りの色々をやってくれる
  • serde_json : json シリアライズ用
  • lambda_http : http リクエスト周りを色々やってくれる
cargo add aws-sdk-ssm aws-config serde_json lambda_http

それではやっていきます。

ライブラリの宣言

https://github.com/KIrie-0217/get-sesami/blob/3567d3ec6131e0b48153925a0ee51ab97d2ebfe8/rust_app/src/main.rs#L1-L4

使うのはココらへんです

Json 用 struct

body に含まれている json を受け取るための構造体です。

https://github.com/KIrie-0217/get-sesami/blob/3567d3ec6131e0b48153925a0ee51ab97d2ebfe8/rust_app/src/main.rs#L6-L9

Lambda 初期化

初期化時に ssm_client を作成し、 Lambda の関数ハンドラに引き渡します

https://github.com/KIrie-0217/get-sesami/blob/3567d3ec6131e0b48153925a0ee51ab97d2ebfe8/rust_app/src/main.rs#L58-L64

関数ハンドラ

Lambda の実際にロジックを記載する関数部分です

受け取った JSON をシリアライズした後、指定の path に対して、パラメータストアから値を取得します。

https://github.com/KIrie-0217/get-sesami/blob/3567d3ec6131e0b48153925a0ee51ab97d2ebfe8/rust_app/src/main.rs#L17-L32

パラメータストアからの値の取得

作成した Client に対して、 get_parameter() でパラメータを取得します。
with_decryption(true) とすることで、KMS暗号化された値を取得できます。

https://github.com/KIrie-0217/get-sesami/blob/3567d3ec6131e0b48153925a0ee51ab97d2ebfe8/rust_app/src/main.rs#L67-L76

デプロイ・動作確認

以下のコマンドでデプロイを実施

sam build --beta-features
sam deploy --guided

デプロイ後 curl で値が取れることを確認します

curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/description -d '{"path": "ssm-test"}'

>ssm-test-done

まとめ

  • 今回のケースだと、POST じゃなくて GET のほうが適切ですね
  • aws sdk 使いやすくて助かる

Discussion