Posted at

AWS Lambda + SSM Parameter Store でカウンターを作る

事の発端はこのツイートを見たこと。

今まで 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 を使うアイデアはかなりアリだなと思った。