AWS Systems Manager - パラメータストア

f:id:hate_nattou:20220118175042p:plain

概略

AWSで動作するコードを書くときに、どうやって秘密情報を管理するのか?

管理方法の1つとして、AWSのパラメータストアを使う方法をまとめます。

これまでの運用

slackのWebhook URLやGCPのアクセストークンなどと言った秘密情報は、secretファイルを作成して、その中に記載していました。

下図のように、ソースコードリポジトリの中にsecretsディレクトリを作成して、その中にsecret.yamlファイルを入れて、ソースコードと一緒に管理していました。


[repository名]
 - secrets
  - secret.yaml
  - secret_sample.yaml
 - app.py


secret.yamlはGitでの管理対象外として、Gitへのアップロードはしません。

ただし、他の人がソースコードを活用しようとした場合にはそのままでは動作しないので、secret_sample.yaml というファイルを用意し、必要な内容の例を記すようにしていました。
sample.yamlのファイルはGit管理対象とし、Gitへアップロードします。

この方法だと、運用も複雑だし、Gitの設定をミスしたら世界へ秘密情報を発信してしまう危険もあります。

パラメータストアを使う

イメージ

秘密情報をAWSのサービスで管理する方法があって、それがSystems Manager - パラメータストア。

lambdaから同じAWSリージョンにあるパラメータストアへアクセスして、課題を解決するイメージは下図のとおり。

f:id:hate_nattou:20220203195118p:plain

AWS Systems Manger

"AWS Systems Manager - パラメータストア" にSecure String形式で保管。

なお、名前については、階層型(/slack/personal/channel/urlのように)で記しておいたほうが管理しやすくなる。

f:id:hate_nattou:20220203192542p:plain

lambda(Python)

Pythonのコードでは、boto3で作成したオブジェクト(ssm)のget_parameterで読み込む。

# URLを取得(AWS Systems Manager - Parameter Store)
ssm = boto3.client("ssm")
response = ssm.get_parameter(Name="URL", WithDecryption=True)

url = response["Parameter"]["Value"]

公式 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html

まとめ

secret.yamlファイルで管理したり、環境変数に設定したりと、これまで様々な手法を試してきた。

AWSの中に閉じて使うのであれば、このパラメータストアを使う方式が秘密情報を一番簡単に管理できると思う。

あとになって、秘密情報を変更したい場合でも、パラメータストアを変更するだけでよく、ソースコードを変更しなくて良い点が大きなメリット。

Next

応用として...他のアカウントにあるパラメータストアで設定されている情報を読み込むことができるのか?

私の場合、dev環境とprod環境でAWSのアカウントを分けている。

dev環境のAWSアカウントから、prod環境にあるパラメータストアにアクセスしたい。

IAMロールを工夫すればクロスアカウントで利用できるようだ。

クロスアカウントができるっぽい記事

hikari-blog.com

qiita.com