기존에는 ec2에서 aws configure으로 액세스 키, 시크릿 키로 카프카에 접근을 했었는데
이번에 보안상 iam role으로 접근 하게 변경하게 되었다.
근데 관련 자료가 없어서 이참에 한번 정리해보고자 한다.
참고로 액세스 키, 시크릿 키로 ec2에서 접근하는 방법을 찾고 있다면
이전에 포스팅해둔 게 있으니 여기를 참고해봐도 좋을 것 같다.
원하는 권한을 추가한 정책을 만들면 된다.
방법은 여러가지가 있겠지만 aws console에서 msk 쪽 설정에 들어가보면
이런 부분이 있다. 여기서 iam 정책 예제를 복붙해서 정책을 만들어주면 된다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kafka-cluster:Connect",
"kafka-cluster:AlterCluster",
"kafka-cluster:DescribeCluster"
],
"Resource": "arn:aws:kafka:aaaaaa:sdadasd:cluster/sdasdadsd2d/2dsdadsadad"
},
{
"Effect": "Allow",
"Action": [
"kafka-cluster:DescribeTopic",
"kafka-cluster:CreateTopic",
"kafka-cluster:WriteData",
"kafka-cluster:ReadData"
],
"Resource": "arn:aws:kafka:aaaaaa:sdadasd:cluster/sdasdadsd2d/2dsdadsadad"/<TOPIC_NAME_HERE>"
},
{
"Effect": "Allow",
"Action": [
"kafka-cluster:AlterGroup",
"kafka-cluster:DescribeGroup"
],
"Resource": "arn:aws:kafka:aaaaaa:sdadasd:cluster/sdasdadsd2d/2dsdadsadad"/<GROUP_NAME_HERE>"
}
]
}
뭐 이런식으로 나와있을텐데 뒤에 <TOPIC_NAME_HERE>, <GROUP_NAME_HERE> 이런 부분은 직접 명시해주거나 모든 토픽, 그룹에 대해 권한을 주고 싶으면 *로 하면 된다
그리고 저기서 추가하고 싶은 권한은 따로 추가해줘도 된다.
이제 위의 정책을 연결한 iam role을 만들고 ec2에 연결하면 된다.
iam role 만드는 건 그냥 iam 들어가서 역할 생성 누르고 위에서 만든 policy 연결만 해주면 된다.
ec2랑 연결하는 것도 간단하다.
원하는 ec2 들어가서 iam 역할 수정 누르고 위에서 만든 iam role 선택해주면 된다.
자 이제 ec2에 접근해서 카프카 접속이 되는 지 테스트 해보면 된다.
sudo yum -y install java-11
wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.12-2.8.1.tgz
tar -xzf kafka_2.12-2.8.1.tgz
wget https://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.1/aws-msk-iam-auth-1.1.1-all.jar
자 일단 위 파일들을 저렇게 다운 받아서 준비해준다
security.protocol=SASL_SSL
sasl.mechanism=AWS_MSK_IAM
sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
그리고 위의 설정들을 복사해서 파일을 하나 만들어준다.
나는 kafka_2.12-2.8.1/config/client.properties를 만들어 복붙해줬다.
그리고 aws-msk-iam-auth-1.1.1-all.jar 파일을 kafka_2.12-2.8.1/libs로 옮겨준다.
이거 안하면 에러가 나니 주의하자
export CLASSPATH=/home/ec2-user/aws-msk-iam-auth-1.0.0-all.jar
이런식으로 직접 설정해주는 방법도 있긴한데 추천하진 않는다.
export BS=엔드포인트:포트
./bin/kafka-topics.sh --bootstrap-server $BS --command-config ./config/client.properties --list
그리고 토픽 리스트 출력 명령어로 카프카에 접근 되는 지 테스트해본다.
설정이 제대로 됐으면 접근이 될 것이다.
만약 접근이 안된다?
1. iam 정책을 수정해보자
정책에 권한이 부족해서 그럴 수도 있다.
정책에 "kafka-cluster:*"을 한번 추가해보자
모든 권한을 다 준다는 건데 만약 이렇게해서 접근이 되면
정책 문제가 맞는 거니 필요한 권한을 다시 설정해보자
[2024-12-17 00:51:36,789] ERROR [AdminClient clientId=adminclient-1] Connection to node -1 (boot-~amazonaws.com/000.000.000.00:9098) failed authentication due to: [000000]: Access denied (org.apache.kafka.clients.NetworkClient)
[2024-12-17 00:51:36,790] WARN [AdminClient clientId=adminclient-1] Metadata update failed due to authentication error (org.apache.kafka.clients.admin.internals.AdminMetadataManager)
org.apache.kafka.common.errors.SaslAuthenticationException: [000000]: Access denied
Error while executing topic command : [000000]: Access denied
[2024-12-17 00:51:36,800] ERROR org.apache.kafka.common.errors.SaslAuthenticationException: [000000]: Access denied
나는 위와 같은 에러가 났다.
정책에 권한이 부족한가 싶어서 이것저것 해봤지만 달라지는 건 없었다.
aws sts get-caller-identity
나와 비슷한 에러가 났다면 위 명령어를 한번 쳐보자
에러가 나면 현재 ec2에 접속한 유저는 자격증명이 없는 거다.
sudo -i aws sts get-caller-identity
이렇게 한번 해보자
나같은 경우에는 이렇게 하니 정상적으로 명령어가 동작했다.
sudo ./bin/kafka-topics.sh --bootstrap-server $BS --command-config ./config/client.properties --list
그렇다면 이렇게 sudo를 앞에 붙였을 때 정상동작 할 거다.
그리고 참고로 위에 aws-msk-iam-auth-1.0.0-all.jar를 libs 폴더로 옮기지 않았다면
클래스 패스를 인식 못해서 에러가 날거다.