まえがき
昨今AWSのアクセスキーをGitHubに誤って上げてしまいオギャーなことになるケースがあるそうです。
それを未然に防ぐ手段として、環境変数に値を埋め込みそれを読み込む手法などがあるそうですが、AWSのSystemManagerにパラメータストアと言った機能があることを知りました。
今回はこの機能を用い、Pythonからアクセスキーの取得を行ってみたいと思います。
追記
以下のようなコメントをいただきました。
アクセスキーを利用せずにIAMロールを利用したほうが、なおよいかと思いますがいかがでしょうか。
仰るとおりです。。。今回は、こちらの諸事情でアクセスキーが必要となるケースだったこともあり、当手法でアクセスキーの取得を行った次第です。
ですので、 そのような事情がない場合でしたら、IAMのロールを使用しましょう。
なお、このパラメータストアはECSなどで環境変数を設定する際には有用な機能のようです。例として、DBのパスワードなどを平文で環境変数に埋め込む必要がなくなるなど挙げられていました。
(参考:ECSでごっつ簡単に機密情報を環境変数に展開できるようになりました!)
検証環境
Amazon Linux AMI release 2018.03
実現方法
GUIで操作していきます(もちろんCLIでもできるそうです)
- AWS SystemManagerのパラメータストアに入ります(東京リージョンならここ)
- こんな画面が出てきます
- パラメータの作成をクリック
- 以下フォームを埋める
- 名前: 「/project/keyname」のように記入(/を増やす、つまり「/project/dev/keyname」のような管理も可能)
- 説明: 値の説明
- 利用枠: 標準を選択(大規模なシステムの場合だと上限値を増やす必要があるとか)
- タイプ: 任意のものを選択。安全な文字列を選択すると、KMSでデータを暗号化してくれる。
- 値: 格納したい値を記入
今回は以下のような設定で値を作成。値を記入後は パラメータの作成
を押下。
名前: /project/test
説明: test param
利用枠: 標準
タイプ: 安全な文字列
KMSの主要なソース(安全な文字列を選んだ場合選択): 現在のアカウント
KMSキーID: alias/aws/ssm
値: hello project
タグ: 空
コンソール側で行うことは以上です。
次は、EC2インスタンス上での作業です。
-
aws-paramstore-py をインストール
pip install aws-paramstore-py
特に依存も無くインストールされるはず。 -
以下コードの実行で、値(
hello project
)が取得できるfrom boto3.session import Session import aws_paramstore_py as paramstore ssm = Session(profile_name='default').client('ssm', region_name='ap-northeast-1') params = paramstore.get('/project', decryption=True, ssm_client=ssm) print(params['test'])
ハマりどころ
ってほどでも無いですが、KMSで暗号化した場合、 aws_paramstore_py
から返ってくる値は暗号化された情報がそのまま渡されるのでぐぬぬなことになります。
作者のGitHubを見てみたら、 decryption=False
のオプションがあるのを発見。
こいつを True
にしたら復号化されました。めでたしめでたし。