ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

AWSのパラメータストアを使ってシークレットキーを参照する

やりたいこと

EC2やECSでシークレットキーを利用してAPIを叩く必要がある場合、ソースコードにべた書きは気持ち悪いしどうしようということがあると思います。 AWSのサービスであればもちろんIAMロールを利用するのですが、外部サービスの場合はどうしてもシークレットキーが必要になります。 そこで今回はSystems Managerのパラメータストアという機能を利用して、パラメータストアに保存したシークレットキーをEC2で読み込んで見ます。

パラメータストアとは

正式名称は「AWS Systems Manager パラメータストア」。AWS Systems Managerの一機能。環境変数やパスワードなどの設定データを階層型Key/Value形式で保管できる。暗号化にも対応。

シークレットキー設定

今回はAWSコンソールから設定。AWS-CLIからも設定可能。

f:id:oneal-desu:20181003130955p:plain

f:id:oneal-desu:20181003131109p:plain

f:id:oneal-desu:20181003131406p:plain

IAM Roleの設定

パラメータの取得だけであれば以下の権限があれば問題なさそう。

  • DescribeParameters
  • GetParameter
  • GetParameters

AmazonSSMReadOnlyAccess というデフォルトのポリシーがあるので、この権限を持ったIAMロールを作成してEC2インスタンスにつけてあげる。

docs.aws.amazon.com

シークレットキー参照

CLIで参照してみる。うまくいかない。サブコマンドが存在しないとか言われる。 調べてみると、aws-cliのバージョンが古かったようです。再度aws-cliをインストール

$ pip uninstall awscli
$ pip install awscli --user

docs.aws.amazon.com

気を取り直して、コマンドを実行

$ 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できそう。 階層構造で管理できるので環境ごとの設定値管理も楽にできるのではないかと思う。

参考

kakakakakku.hatenablog.com

dev.classmethod.jp