何をしたいか
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": "*"
}
]
}
パスワードや設定値をパラメーターストアに保存する
コンソールの場合
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でテンプレートを流す際に使用することも可能です。
またちょいちょいメモしていきます。