【AWS】Secrets Manager ~ AWS CLI 編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/03/12/220717
https://dk521123.hatenablog.com/entry/2021/10/05/105550

の続き。

 AWS Secrets Manager でのシークレットの作成を
AWS CLIで行う必要ができたので、メモ。
ついでに過去の記事も整理。

目次

【1】コマンド
 1)list-secrets
 2)get-secret-value
 3)create-secret
 4)put-secret-value
 5)update-secret
【2】使用上の注意
 1)KMSを指定する場合
【3】サンプル
 例1:list-secrets(シークレット一覧)
 例2:get-secret-value(シークレットの取得)
 例3:get-secret-value(シークレット'SecretBinary'の取得)
 例4:create-secret (シークレットの作成)
 例5:create-secret (シークレットの作成 - binary)
 例6:update-secret (シークレットの更新)

【1】コマンド

* 紹介していないコマンドについては、
 以下の公式ドキュメントを参照。

https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/index.html
https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/tutorials_basic.html#tutorial-basic-step2
https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/tutorials_db-rotate.html

1)list-secrets

* シークレット一覧表示

2)get-secret-value

* シークレットの取得。

公式ドキュメント
https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html

3)create-secret

* シークレットの作成

公式ドキュメント
https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/create-secret.html

aws secretsmanager create-secret \
--region <AWS REGION> \
--kms-key-id <KMS KEY ID> \
--name <SECRETS_NAME>  \
--description "<DESCRIPTION>" \
--secret-string <PARAMETER>

4)put-secret-value

* 新しい値(中身)を保存する
 => バージョン管理される

5)update-secret

* シークレットのメタデータ(説明、ローテーション設定など)を更新する
 => バージョン管理されない

公式ドキュメント
https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/update-secret.html

aws secretsmanager update-secret \
--secret-id <value>
--region <AWS REGION> \
--kms-key-id <KMS KEY ID> \
--secret-string <PARAMETER>
# --secret-binary <PARAMETER>
操作 主な目的 影響する範囲
put-secret-value シークレットの新しい値(中身)を保存する 新しいバージョンの作成、値の更新
update-secret シークレットのメタデータ(説明、ローテーション設定など)を更新する 説明文、KMSキー、ローテーション間隔

【2】使用上の注意

1)KMSを指定する場合

[1] aliasで指定する場合は「alias/」が必要

* 「alias/【エイリアス】」で指定

https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/create-secret.html

より抜粋
~~~~
--kms-key-id (string)

An alias is always prefixed by alias/ , for example alias/aws/secretsmanager .
For more information, see About aliases .
~~~~

【3】サンプル

例1:list-secrets(シークレット一覧)

# 一覧がJSON形式で返ってくる
aws secretsmanager list-secrets

# Jq を利用してシークレット名を一覧で取得
aws secretsmanager list-secrets | jq ".SecretList[] .Name"

例2:get-secret-value(シークレットの取得)

# 権限があれば、JSONで結果が返ってくる
aws secretsmanager get-secret-value \
--region us-west-2 --secret-id sample-rds-key

# jqコマンドを使用してJSONをパースする (sudo apt install jq などでインストール)
# jq の -r オプション : 囲み文字であるダブルクォートが除去
aws secretsmanager get-secret-value \
--region us-west-2 --secret-id sample-rds-key | jq -r .SecretString | jq -r .username

# 変数に格納する
secret=$(aws secretsmanager get-secret-value  --region us-west-2 --secret-id sample-rds-key | jq .SecretString | jq fromjson)
user=$(echo $secret | jq -r .username)
password=$(echo $secret | jq -r .password)

# 確認
echo $user

例3:get-secret-value(シークレット'SecretBinary'の取得)

aws secretsmanager get-secret-value \
--region us-west-2 --secret-id sample2-rds-key | jq -r '.SecretBinary' | base64 --decode

例4:create-secret (シークレットの作成)

# JSONファイルをシークレットとして作成(登録?)
aws secretsmanager create-secret \
--region us-west-2 \
--name demo-secret --description "This is a sample" \
--secret-string file://input_demo.json

# 「file://」は重要。詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2022/06/01/154618

<出力結果 (作成したらARNなどが返ってくる)>

{
  "ARN": "arn:aws:secretsmanager:us-west-2:000000000:secret:demo-secret-xxxxx",
  "Name": "demo-secret",
  "VersionId": "xxxx-xxxx-xxxx-xxxx"
}

input_demo.json

{
  "Key1": "Hello",
  "Key2": "World",
  "Key3": "!!!"
}

例5:create-secret (シークレットの作成 - binary)

aws secretsmanager create-secret \
--region us-west-2 \
--name demo-secret-2 --description "This is a sample for binary" \
--cli-binary-format raw-in-base64-out \
--secret-binary fileb://input_demo2.key

# file:// => fileb:// で指定

補足:--cli-binary-format

* AWS CLI バージョン 2 がバイナリ入力パラメータを
 どのように解釈するかを指定

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-options.html#cli-configure-options-cli-binary-format

Option value Explanations
base64 バイナリラージオブジェクト (BLOB) として型指定された入力パラメータは、base64 でエンコードされた文字列を受け入れる。真のバイナリコンテンツを渡すには、コンテンツをファイルに置き、ファイルのパスと名前をパラメータの値として fileb:// プレフィックスを付けて指定。ファイルに含まれる base64 エンコードされたテキストを渡すには、ファイルのパスと名前をパラメータの値として file:// プレフィックスを付けて指定。
raw-in-base64-out 設定の値が raw-in-base64-out の場合、file:// プレフィックスを使用して参照されるファイルはテキストとして読み取らえる

例6:update-secret (シークレットの更新)

aws secretsmanager create-secret \
--region us-west-2 \
--secret-id demo-secret-2 \
--cli-binary-format raw-in-base64-out \
--secret-binary fileb://input_demo2.key

# --name => --secret-id に変更

参考文献

https://qiita.com/inductor/items/ac8f4a1a947f0d3bbaa6

関連記事

機密データの管理 ~ Secrets Manager 編 ~
https://dk521123.hatenablog.com/entry/2020/03/12/220717
機密データの管理 ~ Secrets Manager / boto3 編 ~
https://dk521123.hatenablog.com/entry/2021/10/05/105550
エラー「Invalid length for parameter SAMLMetadataDocument」が発生
https://dk521123.hatenablog.com/entry/2022/06/01/154618
AWS CLI ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/01/000000
gpgコマンド 〜 機密情報をAWS Secrets Managerに格納した場合 〜
https://dk521123.hatenablog.com/entry/2026/05/28/141203