事の発端はこのツイートを見たこと。
目的外利用な気はしますが SSM Parameter Store はどうでしょう
— fujiwara (@fujiwara) September 19, 2019
今まで Lambda を使っていて「データベースを用意するほどじゃないけどちょっとした情報を保存したい」と思うケースが多々あって、もっともカジュアルな方法はなんだろうかと考えていたところだった。
「ちょっとした情報の保存先」として SSM Parameter Store を使うアイデアは面白そうだと思ったので、試しに AWS Lambda + SSM Parameter Store でカウンターを作ってみた。
Lambda Function の実装
SSM Parameter Store に値を保持してカウントアップするだけの素朴な Lambda Function を作った。ランタイムは Python 3.7。
import boto3
ssm = boto3.client('ssm')
def get_param(key: str) -> str:
global ssm
try:
return ssm.get_parameter(Name=key)['Parameter']['Value']
except ssm.exceptions.ParameterNotFound:
return None
def set_param(key: str, value: str):
global ssm
ssm.put_parameter(Name=key, Value=value, Type='String', Overwrite=True)
def lambda_handler(event, context):
key = 'counter'
count = int(get_param(key) or 0)
count += 1
set_param(key, str(count))
return count
Role の設定
このままでは Lambda Function から SSM Parameter Store にアクセスする権限がないので、以下のようなポリシーを持つ IAM Role を作成して Lambda Function に割り当てる。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:PutParameter",
"ssm:GetParameter"
],
"Resource": "arn:aws:ssm:*:*:parameter/counter"
}
]
}
権限を最小限にするために counter
という名前のパラメータの読み書きのみができるようにした。
実行
Lambda Function を実行するたびにカウンターの値が 1 ずつ増えていくことが確認できると思う。
DynamoDB や S3 に保存するよりもはるかに簡単にできたので、「ちょっとした情報の保存先」として SSM Parameter Store を使うアイデアはかなりアリだなと思った。