やりたいこと
EC2やECSでシークレットキーを利用してAPIを叩く必要がある場合、ソースコードにべた書きは気持ち悪いしどうしようということがあると思います。 AWSのサービスであればもちろんIAMロールを利用するのですが、外部サービスの場合はどうしてもシークレットキーが必要になります。 そこで今回はSystems Managerのパラメータストアという機能を利用して、パラメータストアに保存したシークレットキーをEC2で読み込んで見ます。
パラメータストアとは
正式名称は「AWS Systems Manager パラメータストア」。AWS Systems Managerの一機能。環境変数やパスワードなどの設定データを階層型Key/Value形式で保管できる。暗号化にも対応。
シークレットキー設定
今回はAWSコンソールから設定。AWS-CLIからも設定可能。
IAM Roleの設定
パラメータの取得だけであれば以下の権限があれば問題なさそう。
- DescribeParameters
- GetParameter
- GetParameters
AmazonSSMReadOnlyAccess
というデフォルトのポリシーがあるので、この権限を持ったIAMロールを作成してEC2インスタンスにつけてあげる。
シークレットキー参照
CLIで参照してみる。うまくいかない。サブコマンドが存在しないとか言われる。 調べてみると、aws-cliのバージョンが古かったようです。再度aws-cliをインストール
$ pip uninstall awscli $ pip install awscli --user
気を取り直して、コマンドを実行
$ aws ssm get-parameters --name 'TEST_SECRET' --with-decryption { "Parameters": [ { "Name": "TEST_SECRET", "Type": "SecureString", "Value": "testsecret", "Version": 1, "LastModifiedDate": 1538540049.901, "ARN": "arn:aws:ssm:ap-northeast-1:XXXXXXXXXX:parameter/TEST_SECRET" } ], "InvalidParameters": [] }
暗号化した文字列として保存している場合、--with-decryption
を利用しないと暗号化された文字列で出力されてしまう。
もちろんSDKを利用して取得もできる。そちらはまたの機会にやってみる。
感想
環境変数やアクセスキー/シークレットキーが埋め込まれたソースコードをGitに上げるとき、何も考えずにpusできそう。 階層構造で管理できるので環境ごとの設定値管理も楽にできるのではないかと思う。