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を作成します。
構築する環境
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関数と同様です。
実行するコードをインラインで表記します。
詳細につきましては、以下のページをご確認ください。
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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- 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を確認します。
正常にFunction URLが作成されています。
動作確認
準備が整いましたので、各Function URLにアクセスします。
まずFunction1です。
正常に応答が返ってきました。
このようにFunction URLを通じて、VPC外のLambda関数を呼び出すことができました。
続いてFunction2です。
こちらも正常に応答が返ってきました。
このようにFunction URLを通じて、VPC内のLambda関数を呼び出すことができました。
まとめ
Lambda関数の新機能、Function URLをCloudFormationで作成しました。
Function URLを通じて、VPC内外のLambda関数を呼び出せることを確認しました。