はじめに
AWS Lambdaを使って機密情報や設定値を管理する際、コードや環境変数を直接埋め込んでしまうと「本当にこれで安全なのか?」と不安を感じたことはありませんか?
特にAPIキーやデータベース接続情報など、漏洩すると大きなリスクがあるデータの管理は慎重にならざるを得ません。
そんな悩みを解決するのが、AWS Systems Manager Parameter Store です。
このサービスを使えば、機密情報を簡単かつ安全に管理し、Lambda関数や他のAWSリソースで利用できます。
本記事では、Parameter Storeに格納したパラメータをLambda関数から安全に取得する方法を、具体的なコード例と設定手順とともに紹介します。
環境構成
本記事で紹介するサービスの環境構成は以下の通りです。
AWS Systems Manager Parameter Storeとは?
AWS Systems Manager Parameter Store は、アプリケーションの設定情報や機密データを安全に管理できるサービスです。
主な特徴は以下の通りです
-
安全性: AWS Key Management Service (KMS) と統合されており、機密情報を暗号化(
SecureString
型)して保存可能。 -
柔軟性: 機密情報だけでなく、アプリケーション設定のような非機密情報(
String
やStringList
)も管理可能。 - スケーラブル: 大規模な環境でも設定情報を一元管理可能。
- 統合性: AWS LambdaやEC2などのAWSサービスと簡単に連携可能。
これにより、アプリケーションコード内で機密情報をハードコードする必要がなくなり、セキュリティリスクを大幅に軽減できます。
同様のサービスでAWS Secrets Managerがあります。以下の記事でそれぞれの特徴を解説しています。
AWS Secrets ManagerとAWS Systems Manager Parameter Storeの違い
1. Parameter Storeにパラメータを保存する
パラメータの種類
AWS Systems Manager Parameter Storeでは、以下の3種類のパラメータタイプをサポートしています。
タイプ | 説明 | |
String | 平文のデータを保存するシンプルな形式 | |
StringList | カンマ区切りの平文データリストを保存する形式 | |
SecureString | AWS Key Management Service (KMS) で暗号化されたデータ APIキーや認証情報などの機密情報の管理に使用 認定資格でもSecrets Managerと絡めてよく出題されます |
- AWSマネジメントコンソールで AWS Systems Manager > パラメータストア を開きます。
-
パラメータの作成 をクリック。
- 以下を入力:
-
名前:
NormalString
-
利用枠:
標準
-
タイプ:
文字列
-
データ型:
text
-
値:
NormalStringValue
-
名前:
-
パラメータを作成をクリックして保存します。
- マイパラメータに追加されます。
暗号化されたパラメータ(SecureString 型)
-
パラメータの作成 をクリック。
- 以下を入力:
-
名前:
EncryptedString
-
利用枠:
標準
-
タイプ:
安全な文字列
-
KMSのキーソース:
現在のアカウント
-
KMSキーID:
alias/aws/ssm
-
値:
EncryptedStringValue
-
名前:
- パラメータを作成をクリックして保存します。
- マイパラメータに追加されます。
それぞれのarnをメモで控えておいてください。
2. Lambda関数でParameter Storeの値を取得する
次に、保存したパラメータをAWS Lambdaで取得する方法を見ていきます。
まずはLambda関数を作成していきます。
Lambda関数の作成
- ランタイムをpython3.13を指定してLambda関数を作成します。
- コードの設定
以下のコードをコピペしてください。コピペしたらDeployをしてコードを反映させてください。
import boto3
import sys
def get_parameter(parameter_name: str, with_decryption: bool = True) -> str:
"""
AWS Systems Manager Parameter Store からパラメータを取得します。
:param parameter_name: 取得するパラメータの名前
:param with_decryption: 暗号化されたパラメータの場合に復号するかどうか
:return: パラメータの値
"""
try:
# SSM クライアントの作成
ssm_client = boto3.client('ssm')
# パラメータの取得
response = ssm_client.get_parameter(
Name=parameter_name,
WithDecryption=with_decryption
)
return response['Parameter']['Value']
except Exception as e:
print(f"エラーが発生しました: {e}", file=sys.stderr)
sys.exit(1)
def lambda_handler(event, context):
# ユーザー入力
parameter_name1 = "NormalString"
parameter_name2 = "EncryptedString"
# パラメータを取得して表示
parameter_value1 = get_parameter(parameter_name1)
print(f"パラメータ1の値: {parameter_value1}")
parameter_value2 = get_parameter(parameter_name2)
print(f"パラメータ2の値: {parameter_value2}")
- 設定タブ>一般設定からタイムアウトの時間を3秒から10秒に変更してください。
Lambda関数のIAMロールの設定
Lambda関数がParameter Storeからパラメータを取得するIAMポリシーが必要です。こちらのポリシーをLambda関数のIAMロールにアタッチします。
まずはLambda関数のIAMロールを開きます。
Lambda関数の設定タブ>一般設定を選択し、編集を選択してください。画面最下部にIAMロールへのリンクがあります。
IAMロールを開いたら、インラインポリシーの作成を選択して以下のIAMポリシーを作成してください。
Parameter Storeのパラメータを取得を許可するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ssm:GetParameter",
"Resource": [
"arn:aws:ssm:<region>:<AWSアカウント番号12桁>:parameter/NormalString",
"arn:aws:ssm:<region>:<AWSアカウント番号12桁>:parameter/EncryptedString"
]
}
]
}
動作確認
Lambda関数のテストタブからテストを実行すると以下が出力されます。
通常のパラメータや暗号化されたパラメータを両方とも取得できました。
5. まとめ
AWS Systems Manager Parameter Storeを利用することで、機密情報(SecureString)から通常の設定情報(String、StringList)まで、アプリケーションで必要な情報を安全に一元管理できます。
Parameter Storeのメリット:
- 機密情報を暗号化して保存可能
- 非機密情報も統一的に管理可能
- AWS Lambdaなどとの簡単な統合
特に、暗号化されたパラメータを安全に取り扱える点は、セキュリティを重視するアプリケーションにとって非常に有用です。ぜひこの記事を参考に、Lambdaでのパラメータ管理を実現してください。
Parameter StoreのSecure StringとSecret Managerの違いについて知りたい方は以下の記事を参考にしてください。
AWS Secrets ManagerとAWS Systems Manager Parameter Storeの違い
今回の記事の内容についてはAWSの認定資格でも出題される内容です。より詳しく知りたい方は参考書などで理解を深めてみてください。
|
|