~~NOCACHE~~ ## Lambda関数URL Lambdaの関数URLをちょっと触ってみた。 ### 目的 外出先で簡易に状況確認できないかなって・・・ ・CloudWatchのアラーム状態 ・インスタンス落としたか?...など ### 課題 ・Lambda関数URLにブラウザアクセスすると2回実行される(curlコマンドだと1回なのに何故だ?faviconか??)  →faviconだったので[[Aws:Lambda:FunctionURL01#コード②rawPathが「/」だったら実行する版|コードを少し修正]]したらブラウザからリクエストしても1回の通知になりました。(Lambdaは2回実行されちゃうけどね!) ### Lambda関数サンプル #### ポイント ・外出先からを想定して、認証タイプはNONEにしています。 ・最低限の認証として、クエリパラメータに入れた値とLambda関数の環境変数の一致で挙動を変えています。 ・知らない人にリクエストされていないか確認を兼ねて、NGの場合でも結果をSNSからも通知しています。 ・認証をNONEにしていますが、画面上のレスポンスはAWS_IAMと同様に疑似的に{"Message":"Forbidden"}と返しています。←パッと見認証失敗したかのように! ・下記URLの形式でリクエストすると結果が返ってきます。 ・https://xxxxx.lambda-url.ap-northeast-1.on.aws/?AuthId=xxxxxxxxxx {{:Aws:Lambda:pasted:20230214-100336.png?direct 600x0}} #### コード① import os import boto3 client = boto3.client('sns') TARGET_ARN = 'arn:aws:sns:ap-northeast-1:12345678910:[SNSTopic名]' HTTP_RES = {"Message":"Forbidden"} def lambda_handler(event, context): try: token = event['queryStringParameters']['AuthId'] except: token = None try: env = os.environ['AuthId'] except: env = 'NotSet' if token == env: message = 'OK' subject = '簡易監視' + message request = { 'PhoneNumber': TARGET_ARN, 'Message': message, 'Subject': subject } else: message = 'NG' subject = '簡易監視' + message request = { 'PhoneNumber': TARGET_ARN, 'Message': message, 'Subject': subject } response = client.publish(**request) return HTTP_RES if __name__ == '__main__': lambda_handler("event", "context") #### コード②rawPathが「/」だったら実行する版 import os import boto3 client = boto3.client('sns') TARGET_ARN = 'arn:aws:sns:ap-northeast-1:12345678910:[SNSTopic名]' HTTP_RES = {"Message":"Forbidden"} def lambda_handler(event, context): try: path = event['rawPath'] except: path = None if path == '/': try: token = event['queryStringParameters']['AuthId'] except: token = None try: env = os.environ['AuthId'] except: env = 'NotSet' if token == env: message = 'OK' subject = '簡易監視' + message request = { 'PhoneNumber': TARGET_ARN, 'Message': message, 'Subject': subject } else: message = 'NG' subject = '簡易監視' + message request = { 'PhoneNumber': TARGET_ARN, 'Message': message, 'Subject': subject } response = client.publish(**request) else: pass return HTTP_RES if __name__ == '__main__': lambda_handler("event", "context") {{tag>AWS Lambda Python}}