🤖
Lambda オーソライザーのヘッダー認証情報をSystemsManager secure stringから取得できるようにする
概要
シンプルなHTTP APIをlambdaで作成。
このlambdaの前段にはAWS APIGatewayがあり、Clientからのリクエストを受け付ける。
誰でもAPIを叩けてしまうと困るということで認証完了でIAMポリシーを返すlambdaオーソライザーを作成。このオーサライザーをAPIGatewayと紐付けた。
参考)
このヘッダーに付与された認証用文字列をlambdaコードに書きたくなかったのでSystemsManagerのパラメータストアにおいたという流れ。
実装
import json
import boto3
def lambda_handler(event, context):
# SSMクライアントの作成
ssm = boto3.client('ssm')
parameter_name = 'パラメータストアのName'
# SSMからSecureStringの取得
response = ssm.get_parameter(
Name=parameter_name,
WithDecryption=True
)
secret_value = response['Parameter']['Value']
token = event['headers']['authorization']
effect = 'Deny'
#ヘッダ情報と比較し合致していればIAMのEffectがAllowになる
if token == secret_value:
effect = 'Allow'
return_policy = {
'principalId': '*',
'policyDocument': {
'Version': '2012-10-17',
'Statement': [
{
'Action': '*',
'Effect': effect,
'Resource': event['routeArn']
}
]
}
}
return return_policy
補足 IAM Role
この変更にあたりlambdaはSSMのパラメータを取得できるようにする必要があるので以下のようにlambdaのIamRoleを修正した。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:ap-northeast-1:awsaccountid:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:ap-northeast-1:awsaccountid:log-group:/aws/lambda/lambda-auth:*"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:GetParametersByPath"
],
"Resource": "arn:aws:ssm:ap-northeast-1:awsaccountid:parameter/パラメータストアのName"
}
]
}
Discussion