AWSリソースのパスワード等を、AWS上で管理する


何をしたいか

AWSで使用するDBパスワードなどの情報を、外部のパスワード管理ツールや、ましてやコード上で管理せずに、AWSサービスで管理するお話です。
今回はEC2サーバー内から利用するケースで考えます

EC2で必要とするパスワード、パラメータ

こんなものがあるかと思う

RDS, Aurora
・マスターパスワード
・ユーザーログイン情報
・エンドポイントなどの接続情報

EC2等
・OS内での保存しておきたいconfファイル
・接続情報

ユースケース

EC2から、RDSへMySQLログインする
ミドルウェア等の設定値を保存しておきたい
etc

どこで管理するのか

AWS Systems Managerのパラメータストアを使う

必要なプロセス

踏み台サーバーからRDSへアクセスするケースで考える

EC2に必要なRoleを当てる

SSMへのアクセスが必要なインスタンスに、Roleをアタッチする

EC2の場合、以下のポリシーをアタッチ

SSMへの必要な権限(権限を絞る場合)
※リソースもパスでもっと絞れる

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ssm:DescribeParameters",
            "Resource": "*"
        }
    ]
}

パスワードや設定値をパラメーターストアに保存する


図の赤線はCLIの場合

コンソールの場合

SystemsManager > パラメータストア


こんな画面で作成

設定項目に関して

利用枠
4KBもあれば、JSONパラメータをまるっと保存しても、まあまあ足りる気はするが、8KBに拡張することもできる。
この「詳細」を選択した場合の料金は、パラメータストア APIインタラクション1万回毎に、0.05USD

タイプ
「安全な文字列」は、AWSのKMSというサービスを使った
キーでの暗号化がされる
KMSのキーは、AWS管理のキーか、自身で管理したキーで暗号化するか選べる

CLIの場合の設定例

・パラメータストアに値を保存
※ "ssm:PutParameter" Actionの許可が別途必要

aws ssm put-parameter --name /sample/database/master/user --type "String" --value "user" --description "master username" --region ap-northeast-1

今回はRDSのユーザ名とする
名前:/sample/database/master/user
値:user
説明:master username

使うとき

・パラメータの取得

aws ssm describe-parameters --filters "Key=Name, Values=/sample/database/master/user" --region ap-northeast-1

因みに今回は「タイプ」をStringで保存したが、暗号化した場合は"kms:Decrypt"の権限も必要。

運用のコツ

パスの管理

パラメータストアの管理は、システムの環境構成によって階層化した保存をしておくと
運用する際や、実際に引っ張ってくるときにとても楽


環境名/サーバー名/・・・
/Dev/DBServer/MySQL/db-string
/Stg/DBServer/MySQL/db-string

IAM Policyの話

使い慣れたら良いのですが、はじめからActionやResourceを絞ると大変な場合もあるので
はじめは緩めに作ってから、権限を絞るのが無難かもしれません。

SSMの良いところ

今回はパラメータストアだけ挙げましたが、安いし、運用面やセキュリティの観点でたくさんのメリットがあります。
さらに他のAWSサービスとの連携も容易で、例えばCloudFormationでテンプレートを流す際に使用することも可能です。

またちょいちょいメモしていきます。