Amazon Web Services ブログ
AWS Lambda Function URLs の提供開始: 単一機能のマイクロサービス向けの組み込み HTTPS エンドポイント
多くの企業や組織は、AWS Lambda を使用して回復力があるスケーラブルなアプリケーションを構築するために、マイクロサービスアーキテクチャの採用を進めています。これらのアプリケーションは、ビジネスロジックを実装する複数のサーバーレス関数で構成されています。各関数は、Amazon API Gateway や Application Load Balancer などのサービスを使用して、API エンドポイント、メソッド、およびリソースにマッピングされます。
しかし、Lambda 以外の追加のサービスを学習、設定、および運用することなく、関数の前に HTTPS エンドポイントを設定するための簡単な方法だけが必要な場合もあります。例えば、個々の Lambda 関数内で実行されるウェブフックハンドラーやシンプルなフォーム検証ツールの実装が必要になる場合があります。
2022 年 4 月 6 日(米国時間)、Lambda Function URLs の一般提供についてお知らせします。Lambda Function URLs は、任意の Lambda 関数に HTTPS エンドポイントを追加し、オプションで Cross-Origin Resource Sharing (CORS) ヘッダーを設定できるようにする新機能です。
これを使用することで、可用性が高く、スケーラブルで安全な HTTPS サービスの設定とモニタリングを当社が行うため、お客様は重要な業務に集中できます。
Lambda Function URLs の仕組み
新しい関数 URL を作成し、任意の関数にマッピングします。各関数 URL はグローバルに一意であり、関数のエイリアスまたは関数の非修飾 ARN に関連付けることができます。これにより、暗黙的に $LATEST
バージョンが呼び出されます。
例えば、関数 URL を $LATEST
バージョンにマッピングすると、関数 URL を介して各コードの更新を直ちに使用できるようになります。しかし、新しいバージョンを安全にデプロイし、いくつかの統合テストを実行して、準備ができたらエイリアスを更新できるように、関数 URL をエイリアスにマッピングすることをお勧めします。これにより、重み付けされたトラフィックシフトと安全なデプロイを実装することもできます。
関数 URL は Lambda API によってネイティブにサポートされており、AWS マネジメントコンソールまたは AWS SDK、および AWS CloudFormation、AWS SAM、または AWS Cloud Development Kit (AWS CDK) といった Infrastructure as Code (IaC) ツールを介して利用を開始できます。
Lambda Function URLs の動作
新規または既存の関数について、関数 URL を設定できます。ウェブフックを処理する新しい関数の実装方法を見てみましょう。
新しい関数を作成する際に、[Advanced Settings] (高度な設定) の [Enable function URL] (関数 URL を有効化) にチェックを入れます。
ここでは、Auth タイプとして [AWS_IAM] または [NONE] を選択します。ウェブフックは、HTTP ヘッダーで指定された署名に基づいてカスタム認証ロジックを使用します。したがって、私は AuthType [None] を選択します。これは、Lambda が関数を呼び出す前に AWS IAM Sigv4 署名をチェックしないことを意味します。代わりに、承認のために、関数ハンドラー内のカスタムヘッダーを抽出して検証します。
AuthType [None] を使用する場合でも、関数のリソースベースのポリシーではパブリックアクセスを明示的に許可する必要があることに注意してください。明示的に許可しない場合、認証されていないリクエストは拒否されます。AddPermission API を使用して、プログラムで許可を追加できます。この場合、使用している IAM ロールには、自分のアカウントで AddPermission API を呼び出す権限が付与されているため、Lambda コンソールによって必要なポリシーが自動的に追加されます。
ワンクリックで CORS を有効にすることもできます。デフォルトの CORS 設定では、すべてのオリジンが許可されます。そして、関数を作成した後に、よりきめ細かいコントロールを追加します。CORS をあまりご存知ないユーザーのためにご説明すると、CORS は、リソースをロードしたり、API を呼び出したりすることが特定のホストにのみ許可されるようにするために、ブラウザによって実装されるヘッダーベースのセキュリティメカニズムです。ウェブサイトがユーザーの API を使用することを許可されている場合、許可されるオリジン、メソッド、およびカスタムヘッダーを宣言する CORS ヘッダーをいくつか含める必要があります。新しい関数 URL がこれを処理するため、Lambda ハンドラーでこれらすべてを実装する必要はありません。
数秒で、関数 URL は利用可能な状態となります。また、Lambda コンソールでも簡単に見つけてコピーできます。
Node.js で私のウェブフックを処理する関数コードは次のようになります。
exports.handler = async (event) => {
// (オプション) メソッドとクエリ文字列を取得
const method = event.requestContext.http.method;
const queryParam = event.queryStringParameters.myCustomParameter;
console.log(`Received ${method} request with ${queryParam}`)
// 署名とペイロードを取得
const webhookSignature = event.headers.SignatureHeader;
const webhookPayload = JSON.parse(event.body);
try {
validateSignature(webhookSignature); // 署名が無効である場合はスロー
handleEvent(webhookPayload); // 処理エラーの場合はスロー
} catch (error) {
console.error(error)
return {
statusCode: 400,
body: `Cannot process event: ${error}`,
}
}
return {
statusCode: 200, // デフォルト値
body: JSON.stringify({
received: true,
}),
};
};
このコードは、リクエストヘッダー、クエリ文字列、および本文からいくつかのパラメータを抽出しています。API Gateway または Application Load Balancer によって提供されるイベント構造に既に精通しているユーザーにとって、これは見覚えがあることでしょう。
コードを更新した後、HTTP クライアントで関数 URL をテストすることにしました。
例えば、curl
でこれを実行する方法を以下に示します。
$ curl "https://4iykoi7jk2kp5hhd5irhbdprn40yxest.lambda-url.us-west-2.on.aws/?myCustomParameter=squirrel"
-X POST
-H "SignatureHeader: XYZ"
-H "Content-type: application/json"
-d '{"type": "payment-succeeded"}'
または、Python スクリプトを使用する場合は、次のとおりです。
import json
import requests
url = "https://4iykoi7jk2kp5hhd5irhbdprn40yxest.lambda-url.us-west-2.on.aws/"
headers = {'SignatureHeader': 'XYZ', 'Content-type': 'application/json'}
payload = json.dumps({'type': 'payment-succeeded'})
querystring = {'myCustomParameter': 'squirrel'}
r = requests.post(url=url, params=querystring, data=payload, headers=headers)
print(r.json())
テストでは、リクエストの Content-type
を application/json
または text/*
に設定することを忘れないようにしてください。設定しない場合、本文はデフォルトで base64 エンコードされ、Lambda ハンドラーでデコードする必要があります。
もちろん、このケースではウェブフックについて話しているので、この関数は統合しようとしている外部システムから直接リクエストを受け取ります。必要なのは、パブリック関数の URL を提供し、イベントの受信を開始することだけです。
この特定のユースケースでは、CORS 設定は不要です。関数 URL がブラウザから呼び出される他のケースでは、Access-Control-Allow-Origin
、Access-Control-Allow-Methods
、Access-Control-Expose-Headers
など、さらにいくつかの CORS パラメータを設定する必要があります。これらの CORS パラメータは、Lambda コンソールまたは IaC テンプレートで簡単に確認および編集できます。コンソールでは次のように表示されます。
また、各関数 URL は一意であり、特定のエイリアスまたは $LATEST
バージョンの関数にマッピングされることに注意してください。これにより、同じ関数について複数の URL を定義できます。例えば、開発中に $LATEST
バージョンをテストするためのものと、各ステージまたはエイリアスのためのものを定義できます (staging
や production
など)。
Infrastructure as Code (IaC) のサポート
AWS CloudFormation、AWS SAM、および AWS Cloud Development Kit (AWS CDK) を使用して、IaC テンプレートで直接 Lambda Function URLs の設定をすぐに開始できます。
例えば、エイリアスマッピングを含め、Lambda 関数とそのパブリック URL を AWS SAM で定義する方法を次に示します。
WebhookFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: webhook/
Handler: index.handler
Runtime: nodejs14.x
AutoPublishAlias: live
FunctionUrlConfig:
AuthType: NONE
Cors:
AllowOrigins:
- "https://example.com"
IaC テンプレートに既存の Lambda 関数がある場合は、数行のコードで新しい関数 URL を定義できます。
Function URL の料金
関数 URL は Lambda のリクエストと期間の料金に含まれます。例えば、128 MB のメモリと平均呼び出し時間が 50 ミリ秒の Lambda 関数を 1 つデプロイするとします。この関数は毎月 500 万件のリクエストを受信するため、リクエストのコストは 1.00 USD、期間のコストは 0.53 USD になります。米国東部 (バージニア北部) リージョンでは、合計金額は 1 か月あたり 1.53 USD です。
Function URL を使用すべき場合とAmazon API Gateway を使用すべき場合
Function URLs は、リクエストの検証、スロットリング、カスタムオーソライザー、カスタムドメイン名、使用プラン、キャッシュなど、API Gateway の高度な機能を必要としないパブリックエンドポイントで、単一機能のマイクロサービスを実装する必要があるユースケースに適しています。例えば、ウェブフックハンドラー、フォーム検証ツール、モバイル支払処理、広告プレースメント、機械学習推論などを実装しようとしている場合です。また、Lambda コンソールから離れたり、追加のサービスを統合したりすることなく、研究開発中に Lambda 関数を呼び出す最も簡単な方法でもあります。
Amazon API Gateway は、あらゆる規模の API を簡単に作成、公開、保守、モニタリング、保護できるようにするフルマネージドサービスです。API Gateway を使用して、JWT/カスタムオーソライザー、リクエスト/レスポンスの検証と変換、使用プラン、組み込みの AWS WAF サポートなどの機能を活用できます。
2022 年 4 月 6 日(米国時間)より一般提供が開始されます
Function URL は現在、Lambda が利用可能なすべての AWS リージョン (AWS 中国リージョンを除く) で一般提供されています。また、Datadog、Lumigo、Pulumi、Serverless Framework、Thundra、Dynatrace など、多くの AWS Lambda パートナーを通じたサポートもご利用いただけます。
お客様がこの新機能を使用して、どのようにサーバーレスアーキテクチャをシンプルにしたのかをお伺いするのを楽しみにしています。特に、物事がシンプルで、かつ、コストが最適化された状態を維持したい単一機能のユースケースについてお聞きするのを心待ちにしています。
新しい Lambda Function URLs のドキュメントを参照してください。
– Alex
原文はこちらです。