はじめに
アノテーション株式会社の hato です。
2022年4月頃のアップデートですが Lambda に HTTPS エンドポイントを追加する機能(Function URLs)が追加されました。
今回は、この Function URLs が有効なLambda 関数を AWS CLI で作成します。
やってみた
手順
- Lambda 関数用の実行ロール作成
- Lambda 関数の作成
- Function URLs の追加
- テスト
1. Lambda 関数用の実行ロール作成
CloudWatch Logs にログを出力する許可ポリシーを含む実行ロールを作成します。
create-roleコマンドで、まず IAM ロールを作成します。
※2行目は任意のロール名に修正してください。
コマンド例
$ aws iam create-role \
--role-name 【ロール名】 \
--assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
{
"Role": {
"Path": "/",
"RoleName": "hato-lambda-url-role",
"RoleId": "AROAABCDRFGHI",
"Arn": "arn:aws:iam::123456789012:role/hato-lambda-url-role",
"CreateDate": "2023-03-31T01:02:03+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
}
}
attach-role-policyコマンドで、ログを CloudWatch にアップロードする許可が含まれるAWSLambdaBasicExecutionRole
ポリシーをロールに付与します。
※2行目は先ほど指定したロール名に修正してください。
コマンド例
$ aws iam attach-role-policy \
--role-name 【ロール名】 \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
$
2. Lambda 関数の作成
パラメータで渡された二つの数値の掛け算の結果を返すサンプルの Lambda 関数を作成します。
エディタで次のサンプルコード(ファイル名:index.js
)を作成します。
index.js
exports.handler = async (event) => {
let body = JSON.parse(event.body)
const product = body.num1 * body.num2;
const response = {
statusCode: 200,
body: "The product of " + body.num1 + " and " + body.num2 + " is " + product,
};
return response;
};
ZIP圧縮してデプロイパッケージを作成します。
コマンド例
$ zip function.zip index.js
adding: index.js (deflated 40%)
create-functionコマンドで Lambda 関数を作成します。
※2行目は任意の Lambda 関数名に修正してください。
※6行目は「create-role」した際の結果に含まれるArn
に修正してください。
コマンド例
$ aws lambda create-function \
--function-name 【Lambda 関数名】 \
--runtime nodejs14.x \
--zip-file fileb://function.zip \
--handler index.handler \
--role 【ロール ARN】
{
"FunctionName": "hato-url-function",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function",
"Runtime": "nodejs14.x",
"Role": "arn:aws:iam::123456789012:role/hato-lambda-url-role",
"Handler": "index.handler",
"CodeSize": 337,
"Description": "",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2023-03-31T01:02:03.000+0000",
"CodeSha256": "1ZRgJnUnhUNvQG62nALNZmWAp7ZWXC1yih1R6IlPlgA=",
"Version": "$LATEST",
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "24af42e7-ffd6-474d-a551-6c8587122ca5",
"State": "Pending",
"StateReason": "The function is being created.",
"StateReasonCode": "Creating",
"PackageType": "Zip",
"Architectures": [
"x86_64"
],
"EphemeralStorage": {
"Size": 512
},
"SnapStart": {
"ApplyOn": "None",
"OptimizationStatus": "Off"
},
"RuntimeVersionConfig": {
"RuntimeVersionArn": "arn:aws:lambda:ap-northeast-1::runtime:be6b7a67cb4533b2e602f284c4e41058155b081b5879c71929b33e71c124b81d"
}
}
3. Function URLs の追加
作成した Lambda 関数に Function URLs を追加します。
今回は認証が不要な設定で作成します。(function-url-auth-type
を変更すると IAM による認証が追加できます)
add-permissionコマンドでリソースベースのポリシーを追加します。なお、AWS マネジメントコンソールから Function URLs を追加する場合は、自動的にリソースベースのポリシーも追加されます。
※2行目は指定した Lambda 関数名に修正してください。
コマンド例
$ aws lambda add-permission \
--function-name 【Lambda 関数名】 \
--action lambda:InvokeFunctionUrl \
--principal "*" \
--function-url-auth-type "NONE" \
--statement-id url
{
"Statement": "{\"Sid\":\"url\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"lambda:InvokeFunctionUrl\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function\",\"Condition\":{\"StringEquals\":{\"lambda:FunctionUrlAuthType\":\"NONE\"}}}"
}
create-function-url-configコマンドで Function URLs を追加します。
結果のFunctionUrl
に含まれる URL が発行されたエンドポイントです。
※2行目は指定した Lambda 関数名に修正してください。
コマンド例
$ aws lambda create-function-url-config \
--function-name 【Lambda 関数名】 \
--auth-type NONE
{
"FunctionUrl": "https://abcdefg.lambda-url.ap-northeast-1.on.aws/",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function",
"AuthType": "NONE",
"CreationTime": "2023-03-31T01:02:03.000000Z"
}
4. テスト
curl コマンドを使用して10x10の結果をリクエストすると、結果が返却されます。
※2行目は「create-function-url-config」した際の結果に含まれるFunctionUrl
に修正してください。
コマンド例
$ curl -X POST \
'【FunctionUrl】' \
-H 'Content-Type: application/json' \
-d '{"num1": "10", "num2": "10"}'
The product of 10 and 10 is 100
なお、リソースベースのポリシー追加を忘れていると{"Message":"Forbidden"}
が返却されます。
$ curl -X POST \
'https://abcdefg.lambda-url.ap-northeast-1.on.aws/' \
-H 'Content-Type: application/json' \
-d '{"num1": "10", "num2": "10"}'
{"Message":"Forbidden"}
その他のコマンド
エンドポイントの URL を忘れた場合や設定を確認したい場合は、list-function-url-configsコマンドから確認できます。
※2行目は指定した Lambda 関数名に修正してください。
コマンド例
$ aws lambda list-function-url-configs \
--function-name 【Lambda 関数名】
{
"FunctionUrlConfigs": [
{
"FunctionUrl": "https://abcdefg.lambda-url.ap-northeast-1.on.aws/",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function",
"CreationTime": "2023-03-31T01:02:03.000000Z",
"LastModifiedTime": "2023-03-31T01:02:03.000000Z",
"AuthType": "NONE"
}
]
}
Function URLs を削除したい場合は、 delete-function-url-configコマンドから削除できます。削除の際は必要に応じてremove-permissionコマンドでリソースベースのポリシー削除もお忘れなく。
※2行目は指定した Lambda 関数名に修正してください。
コマンド例
$ aws lambda delete-function-url-config \
--function-name 【Lambda 関数名】
$
※2行目は指定した Lambda 関数名に修正してください。
コマンド例
$ aws lambda remove-permission \
--function-name 【Lambda 関数名】 \
--statement-id url
最後に
この記事が誰かのお役にたてば幸いです。
参考資料
- Lambda 関数 URL - AWS Lambda
- Lambda 関数 URL の作成と管理 - AWS Lambda
- Lambda 関数 URL におけるセキュリティと認証モデル - AWS Lambda
- チュートリアル: 関数 URL を使用する Lambda 関数の作成 - AWS Lambda
- Lambda 実行ロール - AWS Lambda
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。