CFNで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関数を呼び出せることを確認しました。

目次