Lambda에서 다른 리전에 SNS Publish할 때 리전 지정

Lambda에서 다른 지역에 SNS 게시



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을 설정하고 있습니다.
빈 테스트를 만들고 테스트를 실행합니다.
몇 분 후, 이하와 같이 메일의 수신을 확인할 수 있었습니다.



리전을 지정하지 않으면 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()를 실행할 때 매개 변수로 자격 증명 (지역)을 전달하여 환경 변수보다 우선합니다 (htps : // 보토 3. 아마조나 ws. 코 m/v1/도쿠멘들 온/아피/아 st/구이데/c레덴치아 ls. html # gue-c redenchia ls).

좋은 웹페이지 즐겨찾기