使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

교차 계정간 Amazon MSK와 AWS IoT Core 연동하기

8 分的閱讀內容
內容層級:中級
6

두 계정에 배포된 Amazon MSK 클러스터와 AWS IoT Core 서비스를 VPC peering을 통해 연결하는 솔루션 가이드입니다.

스트리밍 서비스에서 Kafka 아키텍처는 데이터 엔지니어에게 유용한 옵션이 되었습니다. Amazon Managed Streaming for Apache Kafka (“Amazon MSK”)는 고 가용성 및 높은 확장성, 효율적인 운영 관리를 보장하며 다양한 AWS 서비스들과의 결합된 기능을 제공합니다.

AWS IoT Core서비스를 통해 고객은 IoT 장치를 실시간으로 모니터링하며 IoT 장치의 안정성, 가용성 및 성능을 유지하는 데 도움이 되는 귀중한 통찰력을 얻을 수 있습니다. 또한 IoT Core 서비스 중 하나인 IoT Rule을 통해 Amazon Kinesis Data Streams, Amazon MSK로 데이터 전송, AWS Lambda 함수 호출 등의 데이터 통합을 위한 수행 작업을 지정할 수 있습니다.

이전 문서에서 제공된 가이드는 Amazon MSK와 AWS IoT Core 서비스를 연결함으로써 데이터 통합 능력을 개선하고 IoT 장치의 안정성과 가용성을 보장할 수 있는 사례를 제공합니다. 이러한 통합은 신뢰할 수 있고 효율적인 IoT 기반 데이터 스트리밍 서비스를 원하는 고객들에게 강력하고 확장 가능한 솔루션을 제공합니다.

이번 문서에서는 VPC Peering을 사용하여 서로 다른 계정에 위치한 IoT Core 서비스와 MSK 클러스터 서비스 연동 방법을 단계별로 안내합니다. 두 서비스 간의 액세스는 AWS Secrets ManagerAWS Key Management Service를 기반으로 암호화된 사용자 이름과 비밀번호를 통해 제어됩니다.

이러한 솔루션을 통해 고객들은 IoT Core 서비스 계정과 데이터 통합과 관련된 서비스 계정을 개별적으로 관리할 수 있으며, IoT 서비스와 데이터 통합 서비스 계정을 분리하려는 고객들에게 적합한 사용 사례로 제공될 수 있습니다.

솔루션 개요

아래 그림은 이번 가이드에서 제공하는 솔루션에 대한 전체 아키텍처를 나타냅니다. 계정 A와 계정 B에 위치한 각 VPC 에는 IoT Destination과 MSK 클러스터가 배포되어 있으며 두 서비스는 VPC Peering을 통해 연결됩니다. 두 서비스의 연결은 각 계정에 구성된 AWS Secrets Manager와 AWS Key Management Service를 기반으로 암호화된 사용자 이름과 비밀번호를 통해 제한된 접근만을 허용하며, 이는 허용되지 않은 사용자의 데이터 접근을 차단합니다. 아키텍처

사전 준비

사전에 다음과 같은 구성을 완료해야 합니다.

  • A, B 각 계정에 VPC 및 서로 다른 ip 대역을 가진 private subnet 구성

1 단계 : 계정 A에 MSK Cluster 생성

A 계정에 MSK Cluster를 생성합니다.

  1. A계정으로 MSK 콘솔에 접속합니다. 그 다음 Create Cluster를 선택합니다.
  2. Creation method로 Custom Create 을 선택한 뒤 Cluster name을 입력합니다. create_cluster
  3. Cluster type으로 Provisioned 을 지정합니다. msk_cluster_type
  4. Networking 란에 사전에 설정한 VPC 와 subnet을 지정합니다. 해당 VPC 의 경우 이후 VPC peering 대상이 됩니다. VPC_peering
  5. Access control methods 설정에 SCRAM/SASL authentication 을 선택합니다. SASL_config
  6. 나머지 설정의 경우 기본값 을 선택한 후 클러스터 생성을 선택합니다. 클러스터를 생성하는 데 최대 15분이 걸리며 클러스터 콘솔 창에서 클러스터의 상태가 표시됩니다.

2단계: A, B 계정에 동일한 Secret 생성

클러스터 설정을 완료한 이후 IoT Rule 과 MSK 클러스터 간 SASL/SCRAM 인증에 활용하기 위해 Secret을 생성합니다. IoT Rule 서비스의 경우 교차 계정간 Secret 공유가 비활성화 되어 있으므로, A, B 각 계정에 동일한 username 과 password로 Secret을 생성합니다.

  1. KMS 콘솔을 연 이후 Create key 를 선택합니다.
  2. Key type 으로 Symmetric을 선택하고, Key usage 로 Encrypt and decrypt를 선택합니다. 이후 Next를 선택합니다.
  3. Alias를 입력한 뒤 Next를 선택합니다. 예제에서는 msk-iot-test-key 를 Alias로 사용합니다.
  4. 다음 단계에서 IAM role 생성 이후 KMS 사용 권한을 부여할 예정이므로, 이번 단계에서는 key administrative permissions 과 key usage permissions 은 설정하지 않고 Create Key를 진행합니다. 이제 KMS 키가 생성되었으므로 자격 증명을 위한 Secret을 AWS Secrets Manager에 저장할 수 있습니다.
  5. AWS Secrets Manager 콘솔을 열고 Store a new credential 을 선택합니다.
  6. secret type으로 Other type of secrets (e.g. API key)을 선택합니다.
  7. 사용하시려는 username 및 password를 입력합니다.
  8. Encryption key에 위에서 생성한 Customer Managed KMS키 Alias (msk-iot-test-key)를 선택합니다. KMS
  9. secret을 Amazon MSK 클러스터와 연결하려면 비밀 이름에 prefix로 AmazonMSK_가 있어야 합니다. 이 예에서는 AmazonMSK_test라는 이름을 사용합니다.
  10. Secret 대한 ARN(Amazon Resource Name) 값을 복사합니다.

위 과정을 A, B 각 계정에 동일하게 진행합니다.

3단계: 계정 A 에서 생성한 Secret을 MSK cluster 와 연결

이전 단계에서 생성한 A 계정의 Secret을 동일 계정의 MSK 클러스터와 연결합니다.

  1. Amazon MSK 콘솔로 돌아가서 위에서 생성한 MSK 클러스터를 선택합니다. Associate secrets를 선택하고 이전 단계에서 생성한 Secret의 ARN을 복사하여 붙여넣습니다. 여기에 이미지 설명 입력

4단계: 계정 B에서 계정 A와 VPC peering 생성

두 계정간 VPC 연결을 위해 계정 B 에서 계정 A와 VPC Peering connection 을 생성합니다.

  1. 계정 B의 VPC 콘솔 에 접속한 뒤 Peering connection 탭으로 이동합니다.
  2. Create peering connection을 선택한 후 VPC peering 설정을 진행합니다. VPC_peering
  3. Requester VPC ID에 B 계정 내 VPC ID를 선택합니다.
  4. 교차 계정간 VPC peering 이므로, Another account 를 선택합니다. Account ID의 경우 MSK Cluster 가 있는 계정 A의 ID를 입력합니다.
  5. Accepter 의 VPC ID의 경우 MSK Cluster의 VPC ID를 입력 합니다.
  6. VPC 생성을 마친 뒤 A 계정으로 전환하여 VPC Request Accept 하는 것으로 VPC peering 생성을 완료합니다.
  7. 생성한 VPC peering을 A, B 각 계정의 subnet 의 route table의 Target에 추가합니다. VPC 콘솔에서 Route table 탭에서 사용하고 계신 subnet Route table을 선택 후 Action 탭의 Edit Route을 진행합니다.
  8. 아래와 같이 Destination 에 VPC peering 연동 상대 계정의 subnet CIDR을 입력합니다. Target에는 Peering Connection 을 선택 후 VPC Peering Connection id 를 선택합니다.

계정 A Route table Route_config_A 계정 B Route table Route_config_B

5단계: 계정 B에서 AWS IoT Rule에 대한 AWS Identity and Access Management(IAM) 역할 및 정책 설정

Amazon MSK 클러스터로 데이터를 스트리밍하기 위해 AWS IoT 액세스 권한을 부여해야 합니다. 이를 위해 필요한 AWS 리소스 액세스를 허용하는 정책으로 IAM 역할을 생성해야 합니다.

  1. B 계정의 IAM console로 접속한뒤 Create IAM role을 선택합니다.
  2. Trusted entity type으로 AWS Service 선택한 후 Use Case 으로 IoT 를 설정합니다. IoT_config
  3. policy 를 아래와 같이 생성한뒤 위에서 설정한 IAM role과 연동합니다.
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "ec2:CreateNetworkInterface",
            "ec2:DescribeNetworkInterfaces",
            "ec2:CreateNetworkInterfacePermission",
            "ec2:DeleteNetworkInterface",
            "ec2:DescribeSubnets",
            "ec2:DescribeVpcs",
            "ec2:DescribeVpcAttribute",
            "ec2:DescribeSecurityGroups"
         ],
         "Resource":"*"
      },
      {
         "Effect":"Allow",
         "Action":[
            "secretsmanager:GetSecretValue",
            "secretsmanager:DescribeSecret"
         ],
         "Resource":" "arn:aws:secretsmanager:region:123456789012:AmazonMSK_*"
      }
   ]
}

AWS Secrets Manager에 저장된 secret을 해독하려면 이전에 생성한 Customer Managed KMS 키의 키 사용자 목록에 IAM 역할을 추가해야 합니다.

  1. AWS KMS 콘솔로 이동하고 이전 단계에서 생성한 KMS 키를 선택합니다.
  2. Key users에 IoT-Rule-MSK-Role IAM 역할을 추가합니다.

6단계: AWS IoT Core VPC destination 생성

  1. 계정 B의 AWS IoT 콘솔로 이동하여 Message Routing을 선택한 후 Destinations를 선택합니다.
  2. Create VPC destination 를 선택합니다.
  3. VPC Peering 된 VPC ID 를 선택합니다.
  4. VPC Peering Connection Target 을 설정한 Route table과 연동된 서브넷을 선택합니다.
  5. IAM role란 에 이전 단계에서 생성한 IoT-Rule-MSK-Role을 선택 합니다.

7단계: AWS IoT Rule 생성

  1. AWS IoT콘솔로 이동한 뒤, Message routing 탭 아래 Rules를 선택한 뒤 Create Rule을 선택합니다.
  2. Rule name 을 지정한 뒤 Next를 선택합니다.
  3. SQL statement 로 다음 구문을 입력합니다. 작성 완료 후 Next를 선택합니다.
    • SELECT topic(2) as device_id, temperature FROM 'device/+/data' 여기에 이미지 설명 입력
  4. Rule Action으로 Apache Kafka Cluster를 선택합니다.
  5. VPC destination 란에 이전 단계에서 생성한 VPC 대상을 선택합니다.
  6. Kafka topic란에 사용하실 topic 이름을 지정합니다. kafka_topic_name
  7. bootstrap.servers 에 계정 A에서 생성한 MSK 클러스터 의 SASL/SCRAM Bootstrap 서버 주소를 입력합니다. MSK 클러스터 콘솔의 View Client information 에서 Bootstrap 서버 URL을 확인할 수 있습니다. 여기에 이미지 설명 입력
  8. security.protocol로 SASL_SSL을 선택하고 sasl.mechanism으로 SCRAM-SHA-512를 선택합니다.
  9. sasl.scram.username에 다음 변수를 지정하고 이름 AmazonMSK_test을 2단계에서 저장한 Secret의 이름으로 바꿉니다. ${get_secret('AmazonMSK_test', 'SecretString', 'username', 'arn:aws:iam ::222222222222:role/IoT-Rule-MSK-Role')}
  10. sasl.scram.password에 다음 변수를 지정하고 IoT Rule을 생성 합니다. ${get_secret('AmazonMSK_test', 'SecretString', 'password', 'arn:aws:iam::222222222222:role/IoT-Rule-MSK-Role')} protocol_config

AWS IoT rule 테스트

MQTT test Client를 활용하여 계정 B에서 설정된 IoT Rule대로 계정 A의 MSK 클러스터에 실시간으로 메세지가 전송되는지 테스트를 진행합니다.

  1. 이전 단계에서 생성된 MSK 클러스터에 접속 가능한 EC2 클라이언트 환경을 구성합니다.
  2. 다음 명령어를 통해 Destination에 설정된 Kafka topic을 생성 한 뒤, 해당 topic의 메세지를 읽도록 consumer를 구성합니다.
  • ./kafka-topics.sh --create --bootstrap-server <bootstrap server> —topic test-first-topic —command-config client_sasl.properties
  • ./kafka-console-consumer.sh --bootstrap-server<bootstrap server> —consumer.config client_sasl.properties —topic test-first-topic
  1. AWS IoT console로 이동한 뒤, MQTT test Client 탭으로 이동합니다.
  2. Topic 이름에 이전 단계에서 설정한 테이블 필터 형식에 맞추어 device/1/data 로 입력한뒤, Message payload 에 메세지를 입력합니다. MQTT_test 5.Publish 를 진행한 뒤, 위에서 실행된 consumer 스크립트를 통해 MSK 클러스터 브로커에 메세지가 전송되었는지 확인합니다. consumer_Client

리소스 정리하기

솔루션 테스트를 모두 완료하셨다면 향후 요금이 발생하지 않도록 생성한 모든 리소스를 삭제합니다.

AWS IoT Core

  • 계정 B 에 생성한 IoT Rule 과 IoT Destination 을 삭제합니다.

Amazon MSK

  • 계정 A 에 Kafka 클러스터를 삭제합니다.

AWS KMS

  • 계정 A, B 에 생성한 고객 관리형 키를 삭제합니다.

AWS Secrets Manager

  • 계정 A, B 에 생성한 secret 을 삭제합니다.

AWS IAM

  • 계정 B 에서 생성한 IoT-Rule-MSK-Role 을 삭제합니다. 연결된 policy 도 삭제합니다.

AWS VPC Peering

  • 계정 B 에서 생성한 VPC Peering Connection 을 삭제합니다.

마무리

이 문서는 서로 다른 계정 간 AWS IoT Core 서비스와 MSK 클러스터 연동 방법에 대한 통합 솔루션 가이드를 제공합니다. VPC Peering을 통해 서로 다른 계정에 위치한 서비스들을 안전하게 결합하고, AWS Secrets Manager와 AWS Key Management Service를 통해 MSK 클러스터 및 데이터에 대한 액세스를 보호합니다. 이는 IoT 서비스와 데이터 통합 서비스를 분리하려는 고객들에게 유용한 사례로 제안될 수 있습니다.