내 AWS Lambda 함수를 다른 계정에서 Amazon Simple Notification Service(SNS) 주제에 구독하고 싶어요.
간단한 설명
Amazon SNS 콘솔을 사용하여 Amazon SNS 주제에 계정 간 AWS Lambda 구독을 추가합니다.
해결 방법
사전 요구 사항
시작하기 전에, 다음 사항을 확인하세요.
- Lambda 함수 자원 정책이 SNS가 함수를 호출하도록 허용해야 합니다.
- SNS 주제 액세스 정책을 통해 Lambda는 해당 주제에 구독할 수 있습니다.
참고: SNS 주제는 계정 A에 있고 Lambda 함수는 계정 B에 있습니다.
계정 간 Lambda 함수 구독
계정 간 Lambda 함수를 SNS 주제에 구독하는 방법에는 두 가지가 있습니다.
- 계정 B의 Lambda 콘솔에서 SNS 트리거를 추가하세요
- 계정 B(Lambda 함수가 있는 계정)의 SNS 콘솔에서 Lambda 구독을 추가하세요
자원 생성
계정 A에서SNS 주제 생성:
- Amazon SNS 콘솔을 연 다음, 왼쪽 패널에서 **Topics(주제)**를 선택하세요.
- **Create topic(주제 생성)**을 선택하고 **Topic type(주제 유형)**을 선택한 다음, **Topic name(주제 이름)**을 입력하세요.
- 아래로 스크롤 하여**Create Topic(주제 생성)**을 선택하세요.
계정 B가 주제에 대한 구독 작업을 수행할 수 있도록 허용하세요.
- 주제 액세스 정책을 편집하여 계정 B에 sns:Subscribe권한을 부여하세요.
- 아래 표시된 정책 설명문을 추가하고 **Save(저장)**하세요.
{
"Sid": "Allow-AccountB-To-Subscribe",
"Effect": "Allow",
"Principal": {
"AWS": ""
},
"Action": "sns:Subscribe",
"Resource": ""
}
**참고:****Principal(주체)**의 경우, <AccountB> Lambda 함수가 있는 사용자의 계정 번호로 교체하세요. **Resource(자원)**필드의 경우, <SNSTopicARN> SNS 주제의 사용자 Amazon Resource Name(ARN)으로 교체하세요.
계정 B에서Lambda 함수를 생성하세요.
- AWS Lambda 콘솔에서**Function(함수)**페이지를 여세요.그런 다음, **Create function(함수 생성)**을 선택하세요.
- **Function name(함수 이름)**을 입력하세요.
- **Execution role(실행 역할)**에서 **Create a new role with basic Lambda permissions(기본 Lambda 권한으로 새 역할 생성)**를 선택하세요. Lambda는 Amazon CloudWatch에 로그를 업로드할 수 있는 권한을 함수에 부여하는 실행 역할을 생성합니다.
- 아래로 스크롤 하여 **Create function(함수 생성)**버튼을 선택하세요.
Lambda 콘솔에 트리거를 추가하여 Lambda 함수 구독(옵션 1)
- AWS Lambda 콘솔에서 **Function(함수)**페이지를 열고 사용자가 이전에 생성한 함수를 선택합니다.
- **Add Trigger(트리거 추가)**버튼을 선택하세요.
- 트리거 구성 페이지의 드롭다운 목록에서 SNS를 선택합니다.
- SNS Topic 필드에 주제 ARN을 붙여 넣으세요.
- **Add(추가)**버튼을 선택하세요.
이제 계정 A의 SNS 주제가 계정 B의 사용자 Lambda 함수를 호출할 수 있습니다.
구성 테스트
SNS 주제에 메시지를 게시하여 테스트하세요.
참고: Lambda 콘솔에서 트리거를 추가하면, Lambda는 Amazon SNS가 이 트리거에서 사용자의 Lambda 함수를 호출하는 데 필요한 권한을 자동으로 추가합니다.
SNS 콘솔에서 구독을 추가하여 Lambda 함수 구독(옵션 2)
이 옵션을 사용하려면, SNS 서비스 주체에 lambda:InvokeFunction작업을 수행할 수 있는 권한을 명시적으로 부여해야 합니다.
SNS 서비스 주체가 Lambda 함수를 호출하도록 허용하세요.
Lambda 콘솔의 Functions page(함수 페이지)에서 사용자가 이전에 생성한 함수를 선택하세요. 그런 다음, 다음 단계를 완료하세요.
- Configuration(구성) 탭을 선택한 다음, **Permissions(권한)**를 선택하세요.
- 아래로 스크롤 하여 **Resource-based policy(자원 기반 정책)**섹션으로 이동합니다. 그런 다음, **Add Permissions(권한 추가)**버튼을 선택하세요.
- AWS Service를 선택하고 드롭다운 목록에서SNS를 선택하세요. 그런 다음, 필드를 채웁니다.
**Statement ID(명령문 ID)**의 경우, AllowSNSToInvokeFunction(SNS가 함수를 호출하도록 허용) 으로 설정하세요
**Source ARN(소스 ARN)**의 경우, 이전에 생성한 SNS 주제의 ARN을 붙여 넣으세요
**Action(작업)**에서 lambda:InvokeFunction을 선택하세요
- **Save(저장)**를 선택하세요.
- Lambda에 대한 SNS 구독을 생성하세요.
계정 B에서 Amazon SNS 콘솔을 여세요.
- 왼쪽 패널에서 **Subscriptions(구독) **를 선택하세요.
- **Create Subscription(구독 생성)**버튼을 선택하세요.
- 계정 A의 SNS 주제 ARN을 Topic ARN필드에 붙여 넣으세요.
- Protocol드롭다운 목록에서AWS Lambda를 선택하세요.
- Lambda 함수의 ARN을 Endpoint필드에 붙여 넣으세요
- 아래로 스크롤 하여 **Create subscription(구독 생성)**버튼을 선택하세요.
**참고:**Lambda 함수(계정 B)가 있는 AWS 계정에서 사용자의 Lambda 함수를 SNS 주제에 구독해야 합니다. SNS 주제가 있는 계정(계정 A)에서 구독을 생성하려고 하면, 다음 오류가 발생합니다.
Error code: AccessDeniedException - Error message: User: arn:aws:sts::XXXXXXX:XXXXXXX/XXXXX/XXXXXX is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:region:XXXXXXX:function:XXXXXXX
관련 정보
Amazon Simple Notification Service로 AWS Lambda 사용
내 Amazon SNS 주제에 Lambda 함수를 구독하려고 할 때 권한 부여 오류가 발생하는 이유는 무엇인가요?