CFNでLambda Function URL – 認証方式: NONE

CloudFormationでLambda Function URL - 認証方式:NONE

CloudFormationでLambda Function URLを作成する(NONEバージョン)

2022年4月22日にLambda Function URLがリリースされました。

この新機能は、AWS Lambda サービスの組み込み機能として、HTTPS エンドポイントを介して関数を簡単に呼び出せるようにします。

AWS Lambda 関数 URL: Lambda 関数用の組み込み HTTPS エンドポイント

今回はCloudFormationを使用して、認証方式がNONEで、VPC内外のLambda関数のFunction URLを作成します。

構築する環境

Diagram of Lambda Function URL by CloudFormation - Auth Type: NONE

VPC内外にLambda関数を1つずつ作成します。
それぞれFunction URLを作成し、インターネット越しにアクセスします。
なおLambda関数のランタイム環境はPython3.8とします。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/038

テンプレートファイルのポイント解説

Lambda関数本体

まずLambda関数本体を確認します。

Resources:
  Function1:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: |
          def lambda_handler(event, context):
            return 'hello, from function 1.'
      FunctionName: !Sub "${Prefix}-function-01"
      Handler: !Ref Handler
      Runtime: !Ref Runtime
      Role: !GetAtt FunctionRole1.Arn

  Function2:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: |
          def lambda_handler(event, context):
            return 'hello, from function 2.'
      FunctionName: !Sub "${Prefix}-function-02"
      Handler: !Ref Handler
      Runtime: !Ref Runtime
      Role: !GetAtt FunctionRole2.Arn
      VpcConfig:
        SecurityGroupIds:
          - !Ref FunctionSecurityGroup
        SubnetIds:
          - !Ref FunctionSubnet
Code language: YAML (yaml)

通常のLambda関数と同様です。
実行するコードをインラインで表記します。
詳細につきましては、以下のページをご確認ください。

あわせて読みたい
CloudFormationでLambdaを作成する3パータン(S3/インライン/コンテナ) 【CloudFormationでLambdaを作成する】 CloudFormationでLambdaを作成する場合、大別すると以下の3パターンあります。 S3バケットにコードをアップロードする インライ...

VPC内に設置するLambda関数ですが、適用するセキュリティグループはHTTPS(443/tcp)のインバウンド通信を許可する内容です。

Resources:
  FunctionSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Sub "${Prefix}-FunctionSecurityGroup"
      GroupDescription: Allow HTTPS.
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: !Ref HTTPSPort
          ToPort: !Ref HTTPSPort
          CidrIp: 0.0.0.0/0
Code language: YAML (yaml)

Lambdaを設置するサブネットおよびVPCに関するポイントですが、インターネットゲートウェイや、同ゲートウェイへのルーティング設定は不要です。

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidrBlock

  FunctionSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Ref CidrIp
      VpcId: !Ref VPC
      AvailabilityZone: !Sub "${AWS::Region}${AvailabilityZone}"
Code language: YAML (yaml)

Lambda Function URL

関数を呼び出すHTTPSエンドポイント(Fnction URL)を確認します。

Resources:
  FunctionUrl1:
    Type: AWS::Lambda::Url
    Properties:
      AuthType: NONE
      TargetFunctionArn: !GetAtt Function1.Arn

  FunctionUrl2:
    Type: AWS::Lambda::Url
    Properties:
      AuthType: NONE
      TargetFunctionArn: !GetAtt Function2.Arn
Code language: YAML (yaml)

TypeプロパティにAWS::Lambda::Urlを設定してエンドポイントを作成します。
今回は認証方式にIAMを使用しませんので、AuthTypeプロパティに「NONE」を設定します。

Function URLからLambdaを実行するためのPermission

現時点では、Function URLからインターネット越しにLambda関数を実行することはできません。
これはLambda関数を実行するための権限が設定されていないためです。
これを解決するためにPermissionを作成します。

Resources:
  FunctionUrlPermission1:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunctionUrl
      FunctionName: !GetAtt Function1.Arn
      FunctionUrlAuthType: NONE
      Principal: "*"

  FunctionUrlPermission2:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunctionUrl
      FunctionName: !GetAtt Function2.Arn
      FunctionUrlAuthType: NONE
      Principal: "*"
Code language: YAML (yaml)

ポイントはActionプロパティに「lambda:InvokeFunctionUrl」を設定する点です。
これでFunction URL経由でLambda関数を実行する権限を与えることができます。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • Lambda関数1のFunction URL:https://4qbav7r5hywdr7clbyayo4n7gm0exogq.lambda-url.ap-northeast-1.on.aws/
  • Lambda関数2のFunction URL:https://f4hcdqzqcllahzh7gcc7datqdm0kvahd.lambda-url.ap-northeast-1.on.aws/

AWS Management Consoleからも、各関数のFunction URLを確認します。

Lambda Function URL 2
Lambda Function URL 1

正常にFunction URLが作成されています。

動作確認

準備が整いましたので、各Function URLにアクセスします。
まずFunction1です。

Result of Lambda Function URL 2.

正常に応答が返ってきました。
このようにFunction URLを通じて、VPC外のLambda関数を呼び出すことができました。

続いてFunction2です。

Result of Lambda Function URL 1.

こちらも正常に応答が返ってきました。
このようにFunction URLを通じて、VPC内のLambda関数を呼び出すことができました。

まとめ

Lambda関数の新機能、Function URLをCloudFormationで作成しました。
Function URLを通じて、VPC内外のLambda関数を呼び出せることを確認しました。