🤖

Lambda オーソライザーのヘッダー認証情報をSystemsManager secure stringから取得できるようにする

2024/08/28に公開

概要

シンプルなHTTP APIをlambdaで作成。
このlambdaの前段にはAWS APIGatewayがあり、Clientからのリクエストを受け付ける。
誰でもAPIを叩けてしまうと困るということで認証完了でIAMポリシーを返すlambdaオーソライザーを作成。このオーサライザーをAPIGatewayと紐付けた。
参考)
https://qiita.com/kennyQiita/items/b5d4549cb61899d52091
このヘッダーに付与された認証用文字列を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