
AWS CLI で Lambda function URLs を作成してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
アノテーション株式会社の 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)を作成します。
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サイトをご覧ください。












