AWSの基礎を学ぼう「特別編 Lambda Function URLs」に参加したよ #awsbasics
TL;DR
こちらの勉強会に参加しました
Lambda Function URLsとは
今日はこちらのハンズオンです
まずはマネジメントコンソールの画面をポチポチして、Function URLsを利用した関数の作成をして頂きました。
これ数分でできる!
こちらは、過去に試したときのブログで、細かい手順は書いてあります。認証無しでブラウザから関数を実行するだけだったら、これで十分。
ハンズオン
ハンズオンの手順書は @Keni_W さんが作成してくれました。以下、細かい手順やコマンドは省略してますので、試してみたい方はぜひこちらの手順書を元にやってみてください。
環境構築
Cloud9が起動できたら、CDKのバージョンを確認します。ハンズオン前日に新しいCDKのバージョン(2.24.1)が出たらしいのですが、私の環境では2.22.0だったので、一つ古いバージョンっぽいですね。結局手順の中で
## CDKのバージョン確認
$ cdk --version
2.22.0 (build 1db4b16)
## jqをyum install
$ sudo yum -y install jq
## CDKを初期化
$ mkdir lambda-function-urls-cdk
$ cd lambda-function-urls-cdk/
$ cdk init app --language typescript
## ↓のメッセージが出たので、CDKをバージョンアップしました
****************************************************
*** Newer version of CDK is available [2.24.1] ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************
# CDKをバージョンアップ
$ npm install -g aws-cdk # これでエラーになったので、 "--force" をつけてエラーが取れた
# TypeScriptで作成したLambda関数のプログラムを、を即時にjavascriptへ変換するために、以下のコマンドを実行
$ npm run watch
L1 Construct
CDKはConstructと呼ばれる、AWSリソースを抽象化したコンポーネントを集めた、Construct Libraryを持っています。L1 Constructは、CloudFormationのリソースをそのまま利用するものです。まずはL1 Constructで環境を構成して、関数のデプロイをしてみます。
まずは、Cloud9上でCDKのスタックと、実際に動かしたいLambda関数を作成します。以下のコマンドは一通り関数を作成し終わってから実行します。
# CFn テンプレートを作成
$ cdk synth
# CDKをデプロイする前処理を実行
$ cdk bootstrap
✅ Environment aws://XXXXXXXXXX/ap-northeast-3 bootstrapped.
# CDKリソースをデプロイ
$ cdk deploy
これでデプロイできました。動作確認してみます。
$ curl https://kcmxqoahp57nisrmurpmdwg2xm0pakun.lambda-url.ap-northeast-3.on.aws/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 54 100 54 0 0 193 0 --:--:-- --:--:-- --:--:-- 194
"Hello from Lambda Functions Urls! you request is GET"
L2 Construct
今度は一つ抽象度を上げて、L2 Constructで作成してみます
CDKのスタックを書き換えてから、再度cdk deployを実行しました
~ 中略 ~
// L2 Constract
const lambdaFunctionUrlsL2 = new lambda.Function(this, 'LambdaFunctionUrlsL2', {
runtime: lambda.Runtime.NODEJS_14_X,
code: lambda.Code.fromAsset('lambda'), // code loaded from "lambda" directory
handler: 'index.handler',
timeout: Duration.seconds(10),
});
const lambdaFunctionUrlsL2Url = new lambda.FunctionUrl(this, 'LambdaFunctionUrlsL2Url', {
function: lambdaFunctionUrlsL2,
authType: lambda.FunctionUrlAuthType.NONE
});
new CfnOutput(this, 'TheLambdaFunctionUrlsL2Url', {
value: lambdaFunctionUrlsL2Url.url,
});
~ 以下略 ~
# DIFFをとる
$ cdk diff
# 再度デプロイを実行
$ cdk deploy
さてもう一度動作確認。POSTされました!
$ curl -X POST -H "Content-Type: application/json" -d '{"Key":"aaaa", "Value":"bbb"}' https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 84 100 55 100 29 519 273 --:--:-- --:--:-- --:--:-- 800
"Hello from Lambda Functions Urls! you request is POST"
POSTできるAPIを作成する
さて、ここまで作ったCDKのスタックとLambda関数をアップデートして、POSTの検証をしてみましょう。
CDKのスタックを三度書き換えて、デプロイします。DynamoDBが生えました。
Resources
[+] AWS::DynamoDB::Table SongsTable SongsTableXXXXX
データをPOSTして遊んでみます。
## POSTして、POSTして、POST
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"DEEP FOREST", "artist":"DAI"}' https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 58 100 19 100 39 16 33 0:00:01 0:00:01 --:--:-- 50
"Put Item Success."
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"TRUE SONG", "artist":"DAI"}' https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 56 100 19 100 37 44 86 --:--:-- --:--:-- --:--:-- 130
"Put Item Success."
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"GATE OF HEAVEN", "artist":"DAI"}' https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 61 100 19 100 42 264 584 --:--:-- --:--:-- --:--:-- 859
"Put Item Success."
## POSTしたデータを見てみます
$ curl https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 119 100 119 0 0 1059 0 --:--:-- --:--:-- --:--:-- 1062
[
{
"artist": "DAI",
"title": "GATE OF HEAVEN"
},
{
"artist": "DAI",
"title": "DEEP FOREST"
},
{
"artist": "DAI",
"title": "TRUE SONG"
}
]
VPC LambdaにFunction URLsを設定する
VPC内でLambda関数を動かしている方も大勢いらっしゃるでしょう、ということで、こやつにFunction URLsを設定してみます。
CDKのスタックを更新します。VPCが生まれて、VPC Lambdaが作られました!
Resources
[+] AWS::EC2::VPC LambdaFunctionUrlsVpc LambdaFunctionUrlsVpcXXX
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PublicSubnetSubnet1/Subnet LambdaFunctionUrlsVpcPublicSubnetSubnet1SubnetXXXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PublicSubnetSubnet1/RouteTable LambdaFunctionUrlsVpcPublicSubnetSubnet1RouteTableFXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PublicSubnetSubnet1/RouteTableAssociation LambdaFunctionUrlsVpcPublicSubnetSubnet1RouteTableAssociationXXX
[+] AWS::EC2::Route LambdaFunctionUrlsVpc/PublicSubnetSubnet1/DefaultRoute LambdaFunctionUrlsVpcPublicSubnetSubnet1DefaultRouteXXXXX
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PublicSubnetSubnet2/Subnet LambdaFunctionUrlsVpcPublicSubnetSubnet2SubnetXXXXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PublicSubnetSubnet2/RouteTable LambdaFunctionUrlsVpcPublicSubnetSubnet2RouteTableXXXXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PublicSubnetSubnet2/RouteTableAssociation LambdaFunctionUrlsVpcPublicSubnetSubnet2RouteTableAssociationXXXX
[+] AWS::EC2::Route LambdaFunctionUrlsVpc/PublicSubnetSubnet2/DefaultRoute LambdaFunctionUrlsVpcPublicSubnetSubnet2DefaultRouteXX
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PrivateSubnetSubnet1/Subnet LambdaFunctionUrlsVpcPrivateSubnetSubnet1Subnet7XXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PrivateSubnetSubnet1/RouteTable LambdaFunctionUrlsVpcPrivateSubnetSubnet1RouteTableXXXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PrivateSubnetSubnet1/RouteTableAssociation LambdaFunctionUrlsVpcPrivateSubnetSubnet1RouteTableAssociationXXX
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PrivateSubnetSubnet2/Subnet LambdaFunctionUrlsVpcPrivateSubnetSubnet2SubnetXXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PrivateSubnetSubnet2/RouteTable LambdaFunctionUrlsVpcPrivateSubnetSubnet2RouteTableXXXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PrivateSubnetSubnet2/RouteTableAssociation LambdaFunctionUrlsVpcPrivateSubnetSubnet2RouteTableAssociationEXXXX
[+] AWS::EC2::InternetGateway LambdaFunctionUrlsVpc/IGW LambdaFunctionUrlsVpcXXX
[+] AWS::EC2::VPCGatewayAttachment LambdaFunctionUrlsVpc/VPCGW LambdaFunctionUrlsVpcVPCXX
[+] AWS::IAM::Role LambdaFunctionUrlsForVpc/ServiceRole LambdaFunctionUrlsForVpcServiceRoleXXX
[+] AWS::EC2::SecurityGroup LambdaFunctionUrlsForVpc/SecurityGroup LambdaFunctionUrlsForVpcSecurityGroupXX
[+] AWS::Lambda::Function LambdaFunctionUrlsForVpc LambdaFunctionUrlsForVpc36929F3F
[+] AWS::Lambda::Permission LambdaFunctionUrlsForVpc/invoke-function-url LambdaFunctionUrlsForVpcinvokefunctionurlXXXX
[+] AWS::Lambda::Url LambdaFunctionUrlsVpcUrl LambdaFunctionUrlsVpcUrlXXX
CDKをデプロイしてから、動作確認しましょう
$ curl -X POST -H "Content-Type: application/json" -d '{"Key":"aaaa", "Value":"bbb"}' https://rnyv7okl37l7djvjjzybnv47ky0pzray.lambda-url.ap-northeast-3.on.aws/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 84 100 55 100 29 114 60 --:--:-- --:--:-- --:--:-- 174
"Hello from Lambda Functions Urls! you request is POST"
お片付け
来たときよりも美しく。ハンズオンで作成したスタックをそのままにすると課金されちゃうので、キレイキレイしましょう。
## CDKスタックをキレイサッパリ削除
$ cdk destroy
まとめ
前回、マネジメントコンソールからポチポチして試したときは、Hello Worldを試しただけだったのですが、今回はCDKを使って、Lambda関数に加えて、DynamoDB、VPC、VPC Lambdaも作成しました。
とりあえず手順書通りにやってみて動くことが確認できてから、(特にCDKスタックの)ソースコードを読み込むことで、何をやってたのかがキャッチアップできるかと思います。
それでは。また。