Amazon SNS 주제를 게시하거나 구독할 수 없는 이유는 무엇입니까?

최종 업데이트 날짜: 2021년 11월 4일

Amazon Simple Notification Service(Amazon SNS) 주제를 게시하거나 구독할 수 없습니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

AWS Identity and Access Management(IAM) 리소스 또는 자격 증명필요한 권한 없이는 Amazon SNS 주제를 게시하거나 구독할 수 없습니다.

Amazon SNS 주제를 게시하거나 구독하는 데 필요한 IAM 권한을 부여하려면 사용 사례에 따라 다음 중 하나를 수행합니다.

참고: Amazon SNS는 IAM 자격 증명 기반 및 Amazon SNS 리소스 기반 액세스 정책을 함께 사용하여 SNS 주제에 대한 액세스 권한을 부여합니다. IAM 정책을 사용하여 Amazon SNS 작업 및 주제에 대한 사용자 또는 역할 액세스를 제한할 수 있습니다. IAM 정책으로 다른 AWS 계정이 아닌 AWS 계정 내 사용자에게만 액세스를 제한할 수 있습니다. 자세한 내용은 IAM 및 Amazon SNS 정책을 함께 참조하세요.

해결 방법

Amazon SNS 주제에 게시할 수 있는 다른 AWS 서비스 권한을 부여하려면

Amazon SNS 주제의 리소스 기반 정책은 다른 AWS 서비스가 주제에 메시지를 게시할 수 있도록 허용해야 합니다. 주제의 액세스 정책을 검토하여 필요한 권한이 있는지 확인하고 필요한 경우 추가합니다.

필요한 권한을 추가하려면 다음 권한 설명이 포함되도록 Amazon SNS 주제의 액세스 정책을 편집합니다.

{
    "Sid": "Allow-AWS-Service-to-publish-to-the-topic",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
}

중요: 이러한 권한을 사용하면 SNS 주제의 Amazon 리소스 이름(ARN)에 액세스할 수 있는 모든 사용자가 서비스 엔드포인트를 통해 주제에 메시지를 게시할 수 있습니다. 전역 조건 키를 추가하여 게시 권한을 특정 리소스로 제한할 수 있습니다. 다음 예제에서는 arnLike 조건 연산자 및 aws:SourceArn 전역 조건 키를 사용합니다. 자세한 내용은 Amazon SNS 액세스 제어 사례 예제를 참조하세요.

Amazon SNS 게시 권한을 특정 리소스로 제한하는 IAM 정책의 예

중요: <region> 을 리소스의 AWS 리전으로 교체합니다. <account-id> 를 사용자 계정 ID로 바꿉니다. <resource-name> 을 리소스 이름으로 바꿉니다.

{
    "Sid": "Allow-AWS-Service-to-publish-to-the-topic",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"  
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName",
    "Condition": {
        "ArnLike": {
            "aws:SourceArn": "arn:aws:<service>:<region>:<account-id>:<resource-type>:<resource-name>"
        }
    }
}

참고: Amazon S3는 FIFO SNS 주제를 지원하지 않습니다. 주제 정책에 S3 ARN이 있는 경우 해당 ARN이 버킷 폴더에 대한 경로가 아닌지 확인합니다. 예: arn:aws:s3:*:*:mys3-bucket/*

IAM 사용자 또는 역할이 Amazon SNS 주제를 구독하고 게시하도록 허용하려면

기본적으로 주제 소유자만 주제를 게시하거나 구독할 수 있습니다. 다른 IAM 엔터티가 주제를 구독하고 게시할 수 있도록 하려면 주제의 자격 증명 기반 정책에서 필요한 권한을 부여해야 합니다.

중요: IAM 엔터티의 정책 또는 SNS 주제의 액세스 정책이 SNS 리소스에 대한 액세스를 명시적으로 거부하지 않는지 확인합니다. 자세한 내용은 명시적 거부와 암시적 거부 간의 차이점을 참조하세요.

IAM 엔터티와 SNS 주제가 서로 다른 AWS 계정에 있는 경우

다음 두 가지를 모두 수행합니다.

1.    엔터티가 "sns:Subscribe""sns:Publish" 작업을 실행할 수 있도록 IAM 정책 설명을 IAM 엔터티에 연결합니다. 자세한 설명은 IAM 자격 증명 권한 추가 및 제거를 참조하세요.

다음은 IAM 엔터티가 SNS 주제를 구독하고 게시하도록 허용하는 IAM 자격 증명 기반 정책의 예입니다.

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "sns:Subscribe"
            ],
            "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
        }
    ]
}

2.    주제의 액세스 정책에 SNS 정책 설명을 첨부하여 IAM 엔터티가 "sns:Subscribe""sns:Publish" 작업을 실행할 수 있도록 합니다. 자세한 설명은 내 Amazon SNS 주제의 액세스 정책을 편집하려면 어떻게 해야 합니까?를 참조하세요.

다음은 IAM 엔터티가 SNS 주제를 구독하고 게시할 수 있도록 허용하는 Amazon SNS 주제 액세스 정책의 예입니다.

{
    "Statement": [
        {
            "Sid": "Allow-SNS-Permission",
            "Effect": "Allow",
            "Principal": {
                "AWS": "111122223333"
            },
            "Action": [
                "sns:Publish",
                "sns:Subscribe"
            ],
            "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
        }
    ]
}

참고: Principal은 IAM 자격 증명 기반 사용자 또는 역할 또는 AWS 계정 번호일 수 있습니다. 자세한 내용은 AWS JSON 정책 요소: Principal을 참조하세요.

IAM 엔터티와 SNS 주제가 동일한 계정에 있는 경우

다음 중 하나를 수행하되 둘 다 수행하지는 마세요.

엔터티가 "sns:Subscribe""sns:Publish" 작업을 실행할 수 있도록 IAM 정책 설명을 IAM 엔터티에 연결합니다.

-또는-

주제의 액세스 정책에 SNS 정책 설명을 첨부하여 IAM 엔터티가 "sns:Subscribe" 및 "sns:Publish" 작업을 실행할 수 있도록 합니다.

정책 명령문의 예는 이 문서의 IAM 엔터티와 SNS 주제가 서로 다른 AWS 계정에 있는 경우 섹션을 참조하세요.

(서버 측 암호화(SSE)가 활성화된 주제의 경우) 주제에 필요한 AWS KMS(AWS 키 관리) 권한이 있는지 확인

주제에 SSE가 활성화된 경우 Amazon SNS 주제는 고객이 관리하는 AWS KMS 키를 사용해야 합니다. 이 KMS 키에는 다른 AWS 서비스에 충분한 키 사용 권한을 부여하는 사용자 지정 키 정책이 포함되어야 합니다.

최소 요구 사항은 다음과 같습니다.
"kms:Decrypt"
"kms:GenerateDataKey*"

필요한 AWS KMS 권한을 설정하려면 다음을 수행합니다.

1.    고객이 관리하며 다른 AWS 서비스에 필요한 권한을 포함하는 새 KMS 키를 생성합니다.

2.    방금 생성한 사용자 지정 KMS 키를 사용하여 Amazon SNS 주제에 대한 SSE를 구성합니다.

3.    다른 AWS 서비스가 암호화된 주제에 메시지를 게시할 수 있도록 AWS KMS 권한을 구성합니다.

다른 AWS 서비스가 암호화된 SNS 주제에 메시지를 게시할 수 있도록 허용하는 IAM 정책 설명의 예

{
    "Sid": "Allow-a-service-to-use-this-key",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*"
}