EC2のuserdataを使ってParameterStoreから値を取得する

by

in

EC2インスタンスでのサーバー構築をする際に、必要な情報をParameterStoreからEC2インスタンスのUserDataを使用して取得する構築を行いました!その方法についてのまとめです。

なぜやろうと思ったか?

クラウド環境にサーバーを構築した後、自宅や様々な環境からAWSコンソール/AWS CLIからセッションマネージャやSSH接続を使用してログインすることができます。
ただし、機密性の高いサーバーを構築する場合には、インターネット経由ではなく、オフィスのセキュリティルームなどのオンサイトからのみサーバーへのアクセスを許可したい要件が顧客から加えられることもあります。
このような場合、「コンソール画面からサーバーを構築して、OSなどの内部の設定は後から行う」の方針だと、後々オンサイトでの対応が必要なってしまいます。
そこでEC2インスタンスの便利な機能として、「Userdata」を使う方法があります。

Userdataとは?

EC2インスタンスのUserdataは、インスタンスが起動するときに自動的に実行されるスクリプトやコマンドを指定できる機能です。EC2インスタンスを立ち上げるときに「これを最初にやってね!」という指示を渡すことができるイメージです。
つまり、Userdataに必要なOS設定などを記述をしておけば、EC2インスタンスの立ち上げと同時にOS設定も完了するため、構築後にインスタンスにアクセスして設定を行う必要が無くなるわけです。

Amazon EC2 インスタンスの起動時に、インスタンスの起動後に自動設定タスクを実行したり、スクリプトを実行したりするのに使用するインスタンスにユーザーデータを渡すことができます。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html

ただし、Userdataを使用してサーバーのOSやアプリケーション設定を行う上で、重要なポイントがあります。
それは、パスワードなどのシステムの機密情報が設定に必要になる場合です。このような機密情報をUserdataに直接記述するのはセキュリティの観点で望ましくありません。
そこで、便利なAWSサービスがParameterStoreというサービスです。

ParameterStoreとは?

Parameter Storeは、アプリケーションやシステムの設定情報や秘密情報(パスワードやAPIキーなど)を安全に管理・保存するための場所です。AWSの「Systems Manager」というサービスの一部として提供されています。
したがって、OSやアプリケーション設定で機密情報が必要になる場合、ParameterStoreに値を格納しておいて、Userdataのコマンドからそれらを呼び出すことによってセキュリティ上のリスクを回避することができます。
また、セキュリティ上のメリットのほかに、本番や検証で値が異なる設定を管理するような場合にも有用です。環境設定をParameterStoreに保管しておき、起動時に値を読み込むようにすることで、環境ごとに異なるパラメータを用いて設定を行う、といったことも可能になります。

今回はデモとして、EC2インスタンスを起動するときに、実際にParameterStoreに格納した値を呼び出してみました。

実際にやってみた

ParameterStoreにParameterを作成する

サンプルとして画像のようなパラメータを作成します。
今回は機密情報を格納する想定ということで、TypeにはSecureStringを使用します。
値はとりあえず、SecretValueにしておきます。

続いて、このパラメータを取得する内容でUserDataを作成し、実際にEC2インスタンスを起動してみます。

今回は簡単のため、ParameterStoreから値を取得するだけの一文だけを記述します。

#!/bin/bash
## get parameter
aws ssm get-parameter --name SampleParameter --with-decryption --query "Parameter.Value"

aws ssm get-parameterコマンドでパラメータの名前を取得します。
今回はSecureStringでパラメータを作成しているので、--with-decryptionのオプションをつけるのを忘れずに。
さらに、このときEC2インスタンスにはparameterを取得するために、インスタンスを付与するロールに次の権限を付与する必要があります。これも忘れずに設定しましょう。
※ AWSデフォルトのKMSキーであるaws/ssmを使ってパラメータを暗号化している場合はkms:Decryptの許可は不要。

"ssm:GetParameter"
"kms:Decrypt"

さて、実際に起動してきたEC2インスタンスにログインして、値の取得が成功しているか確認します。
セッションマネージャ等でEC2インスタンスにログインし、sudo cat /var/log/cloud-init-output.logを実行します。このコマンドによって、userdataで実行されたコマンドの結果を確認できます。

[ssm-user@ip-10-0-0-251 ~]$ sudo cat /var/log/cloud-init-output.log

~中略~

Cloud-init v. 22.2.2 running 'modules:config' at Mon, 23 Sep 2024 09:18:38 +0000. Up 7.17 seconds.
Cloud-init v. 22.2.2 running 'modules:final' at Mon, 23 Sep 2024 09:18:39 +0000. Up 8.19 seconds.
"SecretValue"
Cloud-init v. 22.2.2 finished at Mon, 23 Sep 2024 09:18:41 +0000. Datasource DataSourceEc2.  Up 10.30 seconds
Cloud-init v. 22.2.2 running 'init' at Mon, 23 Sep 2024 09:23:13 +0000. Up 5.18 seconds.

ログの下の方で確かに、”SecretValue”の値が取得されていることが確認できます。

今回は簡単のため、secretvalueの取得のみを行いましたが、実際には取得した値を変数に格納するなどして様々なOS/アプリケーション設定に使用することができます。

まとめ

EC2インスタンスのUserdataからパラメータストアのSecureStringの取得を試してみました。
インスタンスの起動時に様々な設定を完了できるのでParameterStoreとの連携は大変便利だと思います!

参考になれば幸いです。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です