異なるリージョンのAWS Lambdaを利用する

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

2015年5月1日訂正 :
- Cognito Eventの他リージョン指定がAWS CLIでできる説明を追加
- CloudFormation Custom Resourceを追加

ども、大瀧です。
先日のGA&大規模アップデートにより実用段階まで来たAWS Lambda、みなさん触っていますか?え?東京リージョンに来ていないからまだ興味がない?!そんなあなたのために、東京リージョンから他のリージョンのLambdaをどう活用できるのか現時点での対応状況をご紹介します!

Lambdaが利用できるリージョン

現時点でLambdaがサービスされているリージョンは、バージニア北部、オレゴン、アイルランドの3つです。GAになった割には控えめな展開ですね。今後、東京など他のリージョンにも広がっていくとは思いますが、そんなのを待ってはいられない!ということで、これら3リージョンのLambdaサービスを他のリージョンとどう組み合わせられるか考えてみます。

LambdaとAWSサービスの組み合わせ

Lambda関数と他のサービスを組み合わせるタイミングは、以下2通りがあります。

  • Lambda関数のイベントソース : Lambda関数のトリガー元
  • Lambda関数による処理対象 : AWS SDK for JavascriptでAPIをコールし操作する対象となるAWSサービス

lambda-other-regions01

Lambda関数による処理は、通常のAWS SDKの実行と同じく任意のリージョンのAPIがコールできますし、Lambdaの実行ロールも他リージョンのリソースを対象にすることができます。例えば、バージニア北部リージョンのLambda関数から東京リージョンのEC2インスタンスを起動というように東京リージョンのサービス/リソース操作が可能です。

対してイベントソースは実際に試してみると、他リージョンのLambda関数の呼び出しが制限させていることがわかりました。イベントソース毎に以下にまとめ、それぞれコメントします。

全ての項目は独自に調査、検証したものでありAWSの定義とは異なる場合があります。また誤認識および今後のアップデートなどの可能性もあるので、おかしな部分があれば指摘ください。

Lambdaのイベントソース名 他リージョンの指定可否
ユーザーアプリケーション
SNSサブスクライバ
S3イベント通知 ×
Kinesis ×
DynamoDB Streams(クローズドプレビュー) ×
Cognito Event ○(AWS CLIから)
CloudFormation Custom Resource ×

ユーザーアプリケーション

ユーザーアプリケーションからの呼び出しは、PC/サーバー上のAWS SDKまたはスマート端末上のAWS Mobile SDKでLambda:InvokeないしLambda:InvokeAsync *1APIコールを指します。これらはエンドポイントによって任意のリージョンを指定できるため、東京リージョンのEC2インスタンスからバージニア北部リージョンのLambdaを呼ぶといったことが可能です。地理的に離れているとネットワーク経路やレイテンシが気になるところなので、Lambdaのエンドポイントがなるべく近いリージョンに欲しいところですね。

SNSサブスクライバ

AWSの通知サービスであるSNSの通知先としてLambdaを指定する形態です。SNSとLambdaの両方の管理画面で紐付けることが可能で、しかもSNSトピックのサブスクライバ追加画面では候補として全リージョンのLambda関数が表示されます!

lambda-other-regions02

Lambdaのイベントソース追加画面では、トピック一覧の候補は同じリージョンのトピックしか出てこないので、ARNを直接指定する少しトリッキーな対応が必要です。

lambda-other-regions03

いずれにせよ、SNSトピックに他リージョンのLambda関数が設定できます。東京のSNSイベントをトリガーにバージニア北部のLambda関数をキックするといった活用ができます。

S3イベント通知

S3に新しいファイルがアップロードされたときの通知先としてLambda関数呼び出しを指定できるものです。現時点では他のリージョンのLambda関数を指定することができませんでした。東京リージョンのS3管理コンソールでは通知先としてLambdaの選択肢が表示されず、AWS CLIでも下記の通りエラーになりました。

$ aws s3api put-bucket-notification-configuration \
>   --region ap-northeast-1 \
>   --bucket takipone-tokyo-sample \
>   --notification-configuration  \
> '{ "LambdaFunctionConfigurations": [
>               {
>                 "Id": "S3ToVirginiaLambda",
>                 "LambdaFunctionArn": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:myFirstLambda",
>                 "Events": ["s3:ObjectCreated:*"]
>               }
> ]}'

A client error (InvalidArgument) occurred when calling the PutBucketNotificationConfiguration operation: The notification destination service region is not valid for the bucket location constraint 
$

回避策はいろいろあると思います。ぱっと思いつくところで、以下2通りあります。

  1. S3イベント通知の通知先といてSNSトピックを設定し、SNSからLambdaをキックする
  2. S3 Cross-Region ReplicationでLambda関数と同じリージョンにバケットを複製し、複製バケットにLambdaへのイベント通知を設定する(参考 : Amazon S3のCross-Region Replicationを使ってAWS Lambdaを発火させる | Developers.IO)

Cross-Region ReplicationだとS3の保存コストが理論上2倍かかるので、SNSの方がスマートですね。

Kinesis

Kinesisストリームから一定数ずつデータを取り出す、後述のDynamoDB Streamsと同じPull型と呼ばれる実行形態です。現時点ではLambdaのイベントソース追加画面からのみKinesisストリームが指定でき、その一覧には同一リージョンのストリームのみ表示されるため、他リージョンのKinesisストリームは指定できないようです。

DynamoDB Streams(クローズドプレビュー)

こちらもKinesisと同様、DynamoDBテーブルの変更履歴を一定数ずつLambdaが取得するPull型です。設定はDynamoDBのテーブル管理画面にある[Streams]タブ-[Associate Lambda Function]ボタンからLambda関数を選択します。候補には同一リージョンのLambda関数のみ表示されることから、これも他リージョンの指定はできないようです。

Cognito Event

モバイル向けストレージサービスのCognito Syncに最近追加されたイベント通知機能です。CognitoとLambdaの両方の管理画面でお互いを紐付けることができますが、管理画面の候補では同一リージョンのもののみ表示されます。AWS CLIのaws cognito-sync set-cognito-eventsコマンドですと、他のリージョンのLambdaのARNが指定できました。

$ aws cognito-sync set-cognito-events --region us-east-1 \
>  --identity-pool-id us-east-1:XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX \
>  --events '{"SyncTrigger": "arn:aws:lambda:us-west-2:XXXXXXXXXXXX:function:OtakiFunc"}'
$

CloudFormation Custom Resource

AWSコンポーネントを一括生成するCloudFormationのCustom Resourceに、Lambdaを登録する機能が最近追加されました(使い方は、弊社清野のブログエントリーが詳しいです)。こちらはドキュメントに「You must create the stacks and Lambda function in the same region,」と、同一リージョンが要件として示されており、他のリージョンのLambdaを呼び出すことはできません。

まとめ

Lambdaの他リージョンからの利用方法をご紹介しました。あらためてまとめておきます。

  • ユーザーアプリケーションからの他リージョンのLambda呼び出しは可能
  • SNS通知先として他リージョンのLambda呼び出しが可能
  • S3イベント通知では、他リージョンのLambdaを直接指定はできないか回避策がある
  • Kinesis、DynamoDB Streams、Cognito Eventでは他リージョンのLambda呼び出しは不可

後半の項目で不可が続きましたが、いずれも新しめの機能ですので今後使えるようになる可能性は十分あると思います。あと、SNSの全能感が光りますね。

東京リージョンをメインで使っている方でも、SNSおよびS3の連携で十分Lambdaが活用できることがご理解いただけたでしょうか?Lambdaを得体の知れない新サービスと遠ざけずに、バシバシ評価・活用してみてください!

脚注

  1. こちらは現在deprecatedとのことです