Amazon Web Services ブログ

Amplify Functions の新機能 : スケジューリングとログストリーミング

AWS Amplify は、Amplify Functions に関数の実行ログストリーミングと cron および自然言語によるスケジューリングサポートの 2 つの新機能を発表します。Amplify では、開発者が TypeScript でサーバーレス関数を作成し、数秒でビジネスロジックをデプロイできるため、すばやくイテレーションできます。Amplify Functions の詳細については、AWS Amplify の Functions ドキュメントを参照してください。

ストリーミング関数ログ

Amplify の開発者ごとのクラウドサンドボックス では、開発者がライブリソースを使ってアプリケーションのバックエンドを設計、構築、イテレーションできる開発環境を提供されます。さらにイテレーションサイクルを減らすために、Amplify は開発者が関数の実行ログをターミナルに直接ストリームできるようになり、ローカルの開発環境から離れることなく関数実行のインサイトが得られるようになりました。

開始するには、--stream-function-logs オプションを指定して、すべての関数ログのストリーミングをオプトインしてください。

npx ampx sandbox --stream-function-logs 

たとえば、認証リソースに Amazon Cognito Lambda トリガーとしてアタッチされた関数の集合がある場合、フロントエンドフレームワークの開発サーバーを起動し、認証フローを通って、各関数の呼び出しからログを検査できます。これらはすべて AWS マネジメントコンソールに移動することなく行えます。

例えば、多数の関数があり、バックエンド機能の一部のデバッグだけに興味がある場合、--logs-filter を指定して関数名に基づいてログ出力をフィルタリングできます。

npx ampx sandbox --stream-function-logs --logs-filter auth 

ログフィルターでは、関数名でフィルタリングできます。上記のコマンド例を使用する場合、トリガーのリソース名の規則は次のようになります。

// amplify/auth/post-confirmation/resource.ts 
import { defineFunction } from "@aws-amplify/backend"

export const postConfirmation = defineFunction({
 name: "auth-post-confirmation",
})

ただし、複雑なフィルターの場合、--logs-filter オプションは正規表現を受け入れます。上記と同じ例を用いて、関数名が “auth” で始まるものだけのログをフィルターする場合は次のようになります。

npx ampx sandbox --stream-function-logs --logs-filter "^auth"

sandbox プロセスは、対応する正規表現と一致する関数のログのみを出力します。

[Sandbox] Watching for file changes...
File written: amplify_outputs.json 
[auth-pre-sign-up] 3:36:34 PM INIT_START Runtime Version: nodejs:18.v30    Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:f89c264158db39a1cfcbb5f9b3741413df1cfce4d550c9a475a67d923e19e2f4 
[auth-pre-sign-up] 3:36:34 PM START RequestId: 685be2bd-5df1-4dd5-9eb1-24f5f6337f91 Version: $ LATEST 
[auth-pre-sign-up] 3:36:34 PM END RequestId: 685be2bd-5df1-4dd5-9eb1-24f5f6337f91 
[auth-pre-sign-up] 3:36:34 PM REPORT RequestId: 685be2bd-5df1-4dd5-9eb1-24f5f6337f91    Duration: 4.12 ms    Billed Duration: 5 ms    Memory Size: 512 MB    Max Memory Used: 67 MB    Init Duration: 173.67 ms 
[auth-post-confirmation] 3:38:40 PM INIT_START Runtime Version: nodejs:18.v30    Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:f89c264158db39a1cfcbb5f9b3741413df1cfce4d550c9a475a67d923e19e2f4 
[auth-post-confirmation] 3:38:40 PM START RequestId: fce69b9f-b257-4af8-8a6e-821f84a39ce7 Version: $ LATEST 
[auth-post-confirmation] 3:38:41 PM 2024-07-19T22:38:41.209Z    fce69b9f-b257-4af8-8a6e-821f84a39ce7    INFO    processed 412f8911-acfa-41c7-9605-fa0c40891ea9 
[auth-post-confirmation] 3:38:41 PM END RequestId: fce69b9f-b257-4af8-8a6e-821f84a39ce7 
[auth-post-confirmation] 3:38:41 PM REPORT RequestId: fce69b9f-b257-4af8-8a6e-821f84a39ce7    Duration: 264.38 ms    Billed Duration: 265 ms    Memory Size: 512 MB    Max Memory Used: 93 MB    Init Duration: 562.19 ms 
[auth-pre-authentication] 3:38:41 PM INIT_START Runtime Version: nodejs:18.v30    Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:f89c264158db39a1cfcbb5f9b3741413df1cfce4d550c9a475a67d923e19e2f4 
[auth-pre-authentication] 3:38:41 PM START RequestId: 9210ca3a-1351-4826-8544-123684765710 Version: $ LATEST 
[auth-pre-authentication] 3:38:41 PM END RequestId: 9210ca3a-1351-4826-8544-123684765710 
[auth-pre-authentication] 3:38:41 PM REPORT RequestId: 9210ca3a-1351-4826-8544-123684765710    Duration: 3.47 ms    Billed Duration: 4 ms    Memory Size: 512 MB    Max Memory Used: 67 MB    Init Duration: 180.24 ms 
[auth-post-authentication] 3:38:42 PM INIT_START Runtime Version: nodejs:18.v30    Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:f89c264158db39a1cfcbb5f9b3741413df1cfce4d550c9a475a67d923e19e2f4 
[auth-post-authentication] 3:38:42 PM START RequestId: 60c1d680-ea24-4a8b-93de-02d085859140 Version: $ LATEST 
[auth-post-authentication] 3:38:42 PM END RequestId: 60c1d680-ea24-4a8b-93de-02d085859140 
[auth-post-authentication] 3:38:42 PM REPORT RequestId: 60c1d680-ea24-4a8b-93de-02d085859140    Duration: 4.61 ms    Billed Duration: 5 ms    Memory Size: 512 MB    Max Memory Used: 68 MB    Init Duration: 172.66 ms 

Amplify ドキュメントを参照して、関数ログのストリーミングの詳細を確認してください

関数の予約実行

2 つ目の改善は、開発者が cron 式や自然言語を使って関数の実行間隔をスケジューリングできるようになったことです。開始するには、新しいscheduleプロパティで間隔を指定します。

// amplify/jobs/drink-some-water/resource.ts 
import { defineFunction } from "@aws-amplify/backend"

export const drinkSomeWater = defineFunction({
 name: "drink-some-water",
 schedule: "every 1h",
})

スケジュールは間隔として定義され、毎時間パフォーマンスの良い投稿の「トップページ」を生成したり、週次ダイジェストとしてパフォーマンスの良い投稿をまとめるなど、さまざまな用途に使用できます。新しい間隔を作成するには、自然言語を使用するだけです。
以下の例では、「 [リマインド ] 毎日水を飲む」関数のスケジューリングを定義しています。

// amplify/jobs/drink-some-water/resource.ts 
import { defineFunction } from "@ aws-amplify/backend"

export const drinkSomeWater = defineFunction({
 name: "drink-some-water",
 schedule: [ 
   "every 5m",
   "every 1h",
   "every day",
   "every week",
   "every year",
 ],
})

スケジューリングはさらに、強く型付けされたプロパティ値を提供することで簡素化されます。これにより、タブ補完が可能になり、スケジュールがシステムの期待に沿うことが保証されます。スケジュールは cron 式を使って複雑な要件を定義できます。たとえば、ゴミを出すリマインダーは、特定の時間に 2 日間だけ出る場合があります。

// amplify/jobs/remind-me-to-take-the-trash-out/resource.ts 
import { defineFunction } from "@aws-amplify/backend";

export const remindMe = defineFunction({
 name: "remind-me-to-take-the-trash-out",
 schedule: [ 
   // every tuesday at 9am 
   "0 9 ? * 3 *",
   // every friday at 9am 
   "0 9 ? * 6 *",
 ] 
})

内部的には、スケジュールは Amazon EventBridge ルール によって実現されています。このルールは、EventBridge がイベントにどのように対応するかを記述する方法です。ここでは、これらのルールは関数が実行される間隔を示しています。

スケジューリング関数の詳細は、Amplify のドキュメントをご覧ください

まとめ

2 つの新機能を Amplify Functions で体験していただけることを心よりお待ちしております。フィードバックがあれば、ぜひ GitHub リポジトリまでお寄せください。同じ志を持つ開発者コミュニティにご参加いただく場合は、Discord コミュニティにご参加ください。

本記事は「New features for Amplify Functions: Scheduling and Log Streaming」を翻訳したものです。

翻訳者について

Photo of author

稲田 大陸

AWS Japan で働く筋トレが趣味のソリューションアーキテクト。普段は製造業のお客様を中心に技術支援を行っています。好きな AWS サービスは Amazon Location Service と AWS Amplify で、日本のお客様向けに Amazon Location Service の解説ブログなどを執筆しています。