AWS CLI で Lambda function URLs を作成してみた

AWS CLI で Lambda function URLs が有効な Lambda 関数を作成してみました
2023.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アノテーション株式会社の hato です。

2022年4月頃のアップデートですが Lambda に HTTPS エンドポイントを追加する機能(Function URLs)が追加されました。

今回は、この Function URLs が有効なLambda 関数を AWS CLI で作成します。

やってみた

手順

  1. Lambda 関数用の実行ロール作成
  2. Lambda 関数の作成
  3. Function URLs の追加
  4. テスト

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

最後に

この記事が誰かのお役にたてば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。