2
1

More than 3 years have passed since last update.

Lambdaで異なるリージョンにSNS Publishするときはリージョンを指定する

Posted at

Lambdaで異なるリージョンにSNS Publishする

 LambdaではPython3.6を使用しています。
 バージニア北部リージョンから、東京リージョンのSNSにPublishします。
 バージニアのLambdaコードはこちら。

lambda_function
from __future__ import print_function
import boto3
import json
import os

def lambda_handler(event, context):
    region = os.environ.get("REGION")
    sns = boto3.client("sns", region_name=region)
    print(region)
    print(sns)
    response = sns.publish(
        TopicArn=os.environ.get("SNS_ARN"),
        Subject="テスト",
        Message="Lambdaで異なるリージョンにSNS Publishしてみた"
    )
    print(response)
    return response

 環境変数REGIONに送信先SNSのリージョンを、SNS_ARNにSNSトピックARNを設定しています。
 空のテストを作成し、テストを実行します。
 数分後、以下のとおりメールの受信を確認できました。

スクリーンショット 2021-02-13 15.18.55.png

 リージョンを指定しない場合、An error occurred (InvalidParameter) when calling the Publish operation: Invalid parameter: TopicArnとエラーになります。

なぜリージョンを指定する必要があるのか

 リージョンを指定しない場合、boto3のデフォルトリージョンはLambdaのリージョンとなるからです。
 これは、AWSがLambdaの環境変数でリージョンを定義しているからです。
 Lambdaでos.environ(環境変数)をprintで表示し、抜粋したものが以下のJSONです。
 一番下にAWS_REGIONがあり、バージニア北部リージョンが指定されています。

{
    "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin",
    "LD_LIBRARY_PATH": "/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib",
    "LANG": "en_US.UTF-8",
    "TZ": ":UTC", 
    "_HANDLER": "lambda_function.lambda_handler", 
    "LAMBDA_TASK_ROOT": "/var/task", 
    "LAMBDA_RUNTIME_DIR": "/var/runtime", 
    "AWS_REGION": "us-east-1", 
}

 クライアントのリージョンを指定していない場合、今回はデフォルトのクライアントのリージョンはバージニア北部リージョンになります。
 そのため、TopicArnで適切にリージョンを指定しても、クライアントのリージョンと異なるためエラーが出てしまいます。

 boto3.client()を実行する際にパラメーターとして資格情報(リージョン)を渡すことで、環境変数より優先されて使用されます(https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#guide-credentials)。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1