Amazon MQ 이벤트 소스를 Lambda용으로 구성하기
Amazon MQ 이벤트 소스를 Lambda용으로 구성하기
주제
본문
네트워크 보안 구성
이벤트 소스 매핑을 통해 Lambda에 Amazon MQ에 대한 전체 액세스 권한을 부여하려면 브로커가 공개 엔드포인트(공개 IP 주소)를 사용하거나, 브로커를 만든 Amazon VPC에 대한 액세스를 제공해야 해요.
Lambda와 함께 Amazon MQ를 사용할 때 함수가 Amazon VPC의 리소스에 액세스할 수 있게 해주는 AWS PrivateLink VPC 엔드포인트를 만들어요.
참고 이벤트 폴러에 기본(온디맨드) 모드를 사용하는 이벤트 소스 매핑이 있는 함수에는 AWS PrivateLink VPC 엔드포인트가 필요해요. 이벤트 소스 매핑이 프로비저닝 모드를 사용한다면 AWS PrivateLink VPC 엔드포인트를 구성할 필요가 없어요.
다음 리소스에 대한 액세스를 제공하는 엔드포인트를 만드세요:
- Lambda — Lambda 서비스 보안 주체에 대한 엔드포인트를 만듭니다.
- AWS STS — 서비스 보안 주체가 사용자를 대신해 역할을 맡을 수 있도록 AWS STS에 대한 엔드포인트를 만듭니다.
- Secrets Manager — 브로커가 자격 증명을 저장하는 데 Secrets Manager를 사용한다면 Secrets Manager에 대한 엔드포인트를 만듭니다.
또는 Amazon VPC의 각 공용 서브넷에 NAT 게이트웨이를 구성하세요. 자세한 내용은 VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화를 참고하세요.
Amazon MQ에 대한 이벤트 소스 매핑을 만들 때 Lambda는 Amazon VPC에 구성된 서브넷과 보안 그룹에 대해 탄력적 네트워크 인터페이스(ENI)가 이미 있는지 확인해요. 기존 ENI를 찾으면 재사용하려고 시도하고, 그렇지 않으면 Lambda가 이벤트 소스에 연결하고 함수를 호출하기 위한 새 ENI를 만들어요.
참고 Lambda 함수는 항상 Lambda 서비스가 소유한 VPC 내부에서 실행돼요. 함수의 VPC 구성은 이벤트 소스 매핑에 영향을 주지 않아요. Lambda가 이벤트 소스에 연결하는 방식을 결정하는 것은 이벤트 소스의 네트워킹 구성뿐이에요.
브로커를 포함하는 Amazon VPC의 보안 그룹을 구성하세요. 기본적으로 Amazon MQ는 다음 포트를 사용해요: 61617(Amazon MQ for ActiveMQ), 5671(Amazon MQ for RabbitMQ).
- 인바운드 규칙 – 이벤트 소스와 연결된 보안 그룹의 기본 브로커 포트에서 모든 트래픽을 허용합니다. 또는 자체 참조 보안 그룹 규칙을 사용해서 동일한 보안 그룹 내 인스턴스의 액세스를 허용할 수 있습니다.
- 아웃바운드 규칙 – 함수가 AWS 서비스와 통신해야 한다면 외부 대상에 대해 포트
443의 모든 트래픽을 허용합니다. 또는 다른 AWS 서비스와 통신할 필요가 없다면 자체 참조 보안 그룹 규칙을 사용해서 브로커에 대한 액세스를 제한할 수 있습니다. - Amazon VPC 엔드포인트 인바운드 규칙 – Amazon VPC 엔드포인트를 사용한다면 Amazon VPC 엔드포인트와 연결된 보안 그룹이 브로커 보안 그룹의 포트
443인바운드 트래픽을 허용해야 합니다.
브로커가 인증을 사용한다면 Secrets Manager 엔드포인트의 엔드포인트 정책을 제한할 수도 있어요. Secrets Manager API를 호출하기 위해 Lambda는 Lambda 서비스 보안 주체가 아니라 함수 역할을 사용해요.
예시 VPC 엔드포인트 정책 — Secrets Manager 엔드포인트
{
"Statement": [
{
"Action": "secretsmanager:GetSecretValue",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws::iam::123456789012:role/{{my-role}}"
]
},
"Resource": "arn:aws::secretsmanager:{{us-west-2}}:123456789012:secret:{{my-secret}}"
}
]
}
Amazon VPC 엔드포인트를 사용하면 AWS가 엔드포인트의 탄력적 네트워크 인터페이스(ENI)를 사용해서 함수를 호출하는 API 호출을 라우팅해요. Lambda 서비스 보안 주체는 해당 ENI를 사용하는 모든 역할과 함수에 대해 lambda:InvokeFunction을 호출할 수 있어야 해요.
기본적으로 Amazon VPC 엔드포인트에는 리소스에 대한 광범위한 액세스를 허용하는 개방형 IAM 정책이 있어요. 모범 사례는 이러한 정책을 해당 엔드포인트를 사용해 필요한 작업만 수행하도록 제한하는 거예요. 이벤트 소스 매핑이 Lambda 함수를 호출할 수 있도록 하려면 VPC 엔드포인트 정책이 Lambda 서비스 보안 주체의 sts:AssumeRole 및 lambda:InvokeFunction 호출을 허용해야 해요. VPC 엔드포인트 정책을 조직 내에서 시작된 API 호출만 허용하도록 제한하면 이벤트 소스 매핑이 제대로 작동하지 않으므로 이러한 정책에는 "Resource": "*"가 필요해요.
다음 예시 VPC 엔드포인트 정책은 AWS STS 및 Lambda 엔드포인트에 대해 Lambda 서비스 보안 주체에 필요한 액세스 권한을 부여하는 방법을 보여줘요.
예시 VPC 엔드포인트 정책 — AWS STS 엔드포인트
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Resource": "*"
}
]
}
예시 VPC 엔드포인트 정책 — Lambda 엔드포인트
{
"Statement": [
{
"Action": "lambda:InvokeFunction",
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Resource": "*"
}
]
}
이벤트 소스 매핑 만들기
이벤트 소스 매핑을 만들어 Lambda가 Amazon MQ 브로커의 레코드를 Lambda 함수로 보내도록 지시하세요. 여러 함수로 동일한 데이터를 처리하거나, 단일 함수로 여러 소스의 항목을 처리하기 위해 여러 이벤트 소스 매핑을 만들 수 있어요.
Amazon MQ에서 읽도록 함수를 구성하려면 필요한 권한을 추가하고 Lambda 콘솔에서 MQ 트리거를 만들어요.
Amazon MQ 브로커에서 레코드를 읽으려면 Lambda 함수에 다음 권한이 필요해요. 함수 실행 역할에 권한 문을 추가해서 Lambda가 Amazon MQ 브로커와 그 기본 리소스와 상호 작용할 수 있는 권한을 부여해요:
- mq:DescribeBroker
- secretsmanager:GetSecretValue
- ec2:CreateNetworkInterface
- ec2:DeleteNetworkInterface
- ec2:DescribeNetworkInterfaces
- ec2:DescribeSecurityGroups
- ec2:DescribeSubnets
- ec2:DescribeVpcs
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
참고
암호화된 고객 관리형 키를 사용할 때는 kms:Decrypt 권한도 추가하세요.
권한을 추가하고 트리거를 만들려면
-
Lambda 콘솔의 함수 페이지를 엽니다.
-
함수 이름을 선택합니다.
-
구성(Configuration) 탭을 선택한 다음 권한(Permissions)을 선택합니다.
-
역할 이름(Role name)에서 실행 역할 링크를 선택합니다. 이 링크는 IAM 콘솔에서 역할을 엽니다.
-
권한 추가(Add permissions)를 선택한 다음 인라인 정책 생성(Create inline policy)을 선택합니다.
-
정책 편집기(Policy editor)에서 JSON을 선택합니다. 다음 정책을 입력합니다. 함수가 Amazon MQ 브로커에서 읽으려면 이러한 권한이 필요해요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"mq:DescribeBroker",
"secretsmanager:GetSecretValue",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
참고
암호화된 고객 관리형 키를 사용할 때는 kms:Decrypt 권한도 추가해야 해요.
-
다음(Next)을 선택합니다. 정책 이름을 입력한 다음 정책 생성(Create policy)을 선택합니다.
-
Lambda 콘솔에서 함수로 돌아갑니다. 함수 개요(Function overview)에서 트리거 추가(Add trigger)를 선택합니다.
-
MQ 트리거 유형을 선택합니다.
-
필수 옵션을 구성한 다음 추가(Add)를 선택합니다.
Lambda는 Amazon MQ 이벤트 소스에 대해 다음 옵션을 지원해요:
- MQ 브로커(MQ broker) – Amazon MQ 브로커를 선택합니다.
- 배치 크기(Batch size) – 단일 배치에서 검색할 최대 메시지 수를 설정합니다.
- 큐 이름(Queue name) – 소비할 Amazon MQ 큐를 입력합니다.
- 소스 액세스 구성(Source access configuration) – 가상 호스트 정보와 브로커 자격 증명을 저장하는 Secrets Manager 시크릿을 입력합니다.
- 트리거 활성화(Enable trigger) – 트리거를 비활성화해서 레코드 처리를 중지합니다.
트리거를 활성화·비활성화(또는 삭제)하려면 디자이너에서 MQ 트리거를 선택하세요. 트리거를 재구성하려면 이벤트 소스 매핑 API 작업을 사용하세요.
더 알아보기 (Learn more)
이 주제는 Amazon MQ 이벤트 소스를 Lambda용으로 구성하는 방법을 설명해요. Amazon MQ와 Lambda 통합에 대한 자세한 내용은 Lambda 개발자 안내서의 관련 페이지를 참고하세요.