Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Conectoreschevron-right

Usando a autenticação AWS IAM com o conector MongoDB para Apache Kafka

Robert Walters, Jagadish Nallapaneni4 min read • Published Jul 01, 2024 • Updated Jul 01, 2024
KafkaJavaConectores
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
O AWS Identity e Access Management (IAM) é um serviço amplamente usado que permite aos desenvolvedores controlar o acesso seguro aos serviços e recursos do AWS. Um dos principais benefícios do AWS IAM é sua capacidade de fazer conexões autenticadas seguras sem que o cliente precise passar senhas confidenciais.
A partir da versão 1.13, o MongoDB Connector para Apache Kafka (Kafka Connector) agora suporta autenticação via Amazon Web Services IAM. O suporte do Amazon Web Services IAM tem sido um dos recursos mais solicitados para o Kafka Connector e, neste tutorial, mostraremos como usá-lo.
Para obter suporte para o AWS IAM, adicionamos suporte para substituir a interface MongoClient, permitindo que um desenvolvedor forneça um CustomCredentialProvider. Embora esse provedor possa ser usado para qualquer método de autenticação, este tutorial se concentrará na criação de um provedor de credenciais do AWS IAM.
Para ilustrar isso, mostraremos uma configuração simples de uma instância do AWS EC2 instalada com o Apache Kafka. Essa instância usará o MongoDB Connector para Apache Kafka para coletar dados de um tópico do Kafka em um cluster Atlas e autenticar usando o AWS IAM.

Pré-requisitos

Se você deseja acompanhar este artigo, certifique-se de ter o seguinte:
  • Uma função do AWS IAM, “KafkaBlogAtlasRole”. Este role será posteriormente mapeado como um utilizador de banco de dados Atlas.
  • Cluster MongoDB Atlas. Se você não tiver um cluster do Atlas, saiba como começar a usar o Atlas..
  • Instância do AWS EC2
    • Install Apache Kafka.
    • Configure a instância do EC2 com uma função AWS IAM, "KafkaConnectBlogRole. "
    • Adicione uma política ao KafkaConnectBlogRole que permita “AssumeRole” no KafkaBlogAtlasRole.
Política de exemplo:
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Sid": "KafkaAtlasBlogPolicy",
6 "Effect": "Allow",
7 "Action": "sts:AssumeRole",
8 "Resource": "arn:aws:iam::979559056307:role/KafkaBlogAtlasRole"
9 }
10 ]
11}
  • Java Development Kit versão 8 ou posterior
  • Um usuário de banco de dados no cluster MongoDB Atlas desejado
    • Configure o usuário do banco de dados com Amazon Web Services IAM e use o ARN do Amazon Web Services Role para KafkaBlogAtlasRole. O usuário do banco de dados Atlas deve ter acesso de leitura/gravação à coleção desejada.
Caixa de diálogo de edição do MongoDB Atlas mostrando o método de autenticação do AWS IAM
Neste ponto, estamos prontos para começar a criar o provedor de autenticação personalizado.

Começar

A partir da versão 1 13.MongoDB connector do para Apache Kafka, agora podemos conectar um fornecedor de autenticação personalizado. Neste artigo, criaremos um provedor de autenticação personalizado em Java, compilaremos e adicionaremos ao diretório lib de sua implantação do Kafka. O fornecedor que criaremos suportará a autenticação IAM Amazon Web Services .

Construindo o componente de autenticação personalizado

Para começar, no seu editor Java favorito, crie um projeto e construa o seguinte JAR que contém esta fonte:
SampleAssumeRoleCredential.java
1package com.mongodb;
2
3import java.util.Map;
4import java.util.function.Supplier;
5
6import com.mongodb.kafka.connect.util.custom.credentials.CustomCredentialProvider;
7
8import com.amazonaws.auth.AWSCredentialsProvider;
9import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
10import com.amazonaws.services.securitytoken.AWSSecurityTokenService;
11import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceAsyncClientBuilder;
12import com.amazonaws.services.securitytoken.model.AssumeRoleRequest;
13import com.amazonaws.services.securitytoken.model.AssumeRoleResult;
14import com.amazonaws.services.securitytoken.model.Credentials;
15import com.amazonaws.util.StringUtils;
16
17public class SampleAssumeRoleCredential implements CustomCredentialProvider {
18
19 public SampleAssumeRoleCredential() {}
20 @Override
21 public MongoCredential getCustomCredential(Map<?, ?> map) {
22 AWSCredentialsProvider provider = new DefaultAWSCredentialsProviderChain();
23 Supplier<AwsCredential> awsFreshCredentialSupplier = () -> {
24 AWSSecurityTokenService stsClient = AWSSecurityTokenServiceAsyncClientBuilder.standard()
25 .withCredentials(provider)
26 .withRegion("us-east-1")
27 .build();
28 AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest().withDurationSeconds(3600)
29 .withRoleArn((String)map.get("mongodbaws.auth.mechanism.roleArn"))
30 .withRoleSessionName("Test_Session");
31 AssumeRoleResult assumeRoleResult = stsClient.assumeRole(assumeRoleRequest);
32 Credentials creds = assumeRoleResult.getCredentials();
33 // Add your code to fetch new credentials
34 return new AwsCredential(creds.getAccessKeyId(), creds.getSecretAccessKey(), creds.getSessionToken());
35 };
36 return MongoCredential.createAwsCredential(null, null)
37 .withMechanismProperty(MongoCredential.AWS_CREDENTIAL_PROVIDER_KEY, awsFreshCredentialSupplier);
38 }
39
40 @Override
41 public void validate(Map<?, ?> map) {
42 String roleArn = (String) map.get("mongodbaws.auth.mechanism.roleArn");
43 if (StringUtils.isNullOrEmpty(roleArn)) {
44 throw new RuntimeException("Invalid value set for customProperty");
45 }
46 }
47
48 @Override
49 public void init(Map<?, ?> map) {
50
51 }
52}
Exemplo de arquivo pom.xml
1<?xml version="1.0" encoding="UTF-8"?>
2<project xmlns="http://maven.apache.org/POM/4.0.0"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6 <groupId>com.mongodb</groupId>
7 <artifactId>SampleAssumeRoleCredential</artifactId>
8 <version>1.0-SNAPSHOT</version>
9 <build>
10 <plugins>
11 <plugin>
12 <groupId>org.apache.maven.plugins</groupId>
13 <artifactId>maven-shade-plugin</artifactId>
14 <version>3.5.3</version>
15 <configuration>
16 <!-- put your configurations here -->
17 </configuration>
18 <executions>
19 <execution>
20 <phase>package</phase>
21 <goals>
22 <goal>shade</goal>
23 </goals>
24 </execution>
25 </executions>
26 </plugin>
27 </plugins>
28 </build>
29
30 <dependencies>
31 <!-- Java MongoDB Driver dependency -->
32 <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync -->
33 <dependency>
34 <groupId>org.mongodb</groupId>
35 <artifactId>mongodb-driver-sync</artifactId>
36 <version>5.1.0</version>
37 </dependency>
38 <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
39 <dependency>
40 <groupId>com.amazonaws</groupId>
41 <artifactId>aws-java-sdk</artifactId>
42 <version>1.12.723</version>
43 </dependency>
44
45 <!-- slf4j logging dependency, required for logging output from the MongoDB Java Driver -->
46 <dependency>
47 <groupId>org.slf4j</groupId>
48 <artifactId>slf4j-jdk14</artifactId>
49 <version>1.7.28</version>
50 </dependency>
51
52 <dependency>
53 <groupId>kafka-connect</groupId>
54 <artifactId>kafka-connect</artifactId>
55 <scope>system</scope>
56 <version>1.13.0</version>
57 </dependency>
58 </dependencies>
59
60 <properties>
61 <maven.compiler.source>17</maven.compiler.source>
62 <maven.compiler.target>17</maven.compiler.target>
63 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
64 </properties>
65
66</project>
Observação: precisamos referenciar o MongoDB Connector para Apache Kafka versão 1.13 ou posterior. Neste exemplo, o connector foi baixado do repositório do Kafka Connector no Github e armazenado no repositório local do Maven.
1mvn install:install-file -Dfile=/Users/robert.walters/Downloads/mongodb-kafka-connect-mongodb-1.13.0/lib/mongo-kafka-connect-1.13.0-confluent.jar -DgroupId=kafka-connect -DartifactId=kafka-connector -Dversion=1.13.0 -Dpackaging=jar\n
Compile e coloque este arquivo SampleAssumeRole.jar no diretório libs do Kafka em seu sistema do Kafka Connect. Agora você está pronto para configurar seu connector MongoDB para Apache Kafka para usar esse fornecedor de autenticação personalizado.

Configure o MongoDB Connector para Apache Kafka

Para oferecer suporte ao provedor personalizado na versão 1.13, as seguintes opções de configuração foram adicionadas ao connector:
Parâmetro de configuraçãoDescrição
mongo.custom.auth.mechanism.enableDetermina se o connector deve usar a classe de provedor; o padrão é falso
mongo.custom.auth.mechanism.providerClassPonto de entrada da classe Java para o provedor personalizado
mongodbaws.auth.mechanism.roleArnFunção que tem acesso do IAM ao banco de dados
Neste exemplo, o componente de autenticação personalizado utilizará o AWS IAM AssumeRole para autenticar com MongoDB Atlas. Aqui está um exemplo desta configuração conectando a um MongoDB Atlas cluster.
1{
2 "name": "mongo-tutorial-sink",
3 "config": {
4 "connector.class": "com.mongodb.kafka.connect.MongoSinkConnector",
5 "topics": "Stocks2",
6 "connection.uri": "<MongoDB Connection String>",
7 "key.converter": "org.apache.kafka.connect.storage.StringConverter",
8 "value.converter": "org.apache.kafka.connect.json.JsonConverter",
9 "value.converter.schemas.enable": false,
10 "database": "Stocks",
11 "collection": "StockData",
12 "mongo.custom.auth.mechanism.enable":"true",
13 "mongo.custom.auth.mechanism.providerClass":"com.mongodb.SampleAssumeRoleCredential",
14 "mongodbaws.auth.mechanism.roleArn":"<AWS IAM ARN>"
15 }
16}
Observe que o roleArn é o ARN (Amazon Resource Name) do papel AWS IAM que é utilizado para usuários do Atlas, KafkaBlogAtlasRole. No tempo de execução, como o Kafka Connect está sendo executado sob a função AWS IAM da instância2 do EC, KafkaConnectBlogRole, e essa função tem uma política que permite AssumeRole no KafkaBlogAtlasRole, o serviço pode se conectar ao Atlas sem armazenar nenhuma credencial!
Agora você está pronto para enviar dados para o Kafka e observá-los chegar em uma coleção do MongoDB usando o MongoDB Connector para Apache Kafka configurado com autenticação do AWS IAM para o MongoDB Atlas.

Resumo

Neste artigo, discutimos os requisitos necessários para oferecer suporte a um provedor de autenticação personalizado, como a autenticação AWS IAM. Versão 1.13 do Kafka Connector introduziu novos parâmetros que definem qual classe usar no arquivo JAR do provedor personalizado. Este arquivo JAR inclui a lógica da autenticação personalizada.
Observe que, embora seja possível adicionar o recurso de autenticação do AWS IAM de forma nativa ao Kafka Connector (afinal, é apenas software), isso não apenas adicionaria uma dependência de versão no AWS IAM SDK, mas também aumentaria significativamente o tamanho do connector, tornando-o impraticável para todos os outros usuários que não desejam usar esse método de autenticação. Por esses motivos, escrever o fornecedor de credenciais personalizado é a solução para integrar o Kafka Connector com métodos de autenticação como o Amazon Web Services IAM.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Implantando o MongoDB em vários clusters do Kubernetes com o MongoDBMulti


Sep 05, 2023 | 11 min read
Tutorial

Vá para o MongoDB usando conectores Kafka - Guia final do agente


Sep 17, 2024 | 7 min read
Artigo

Saiba como aproveitar os dados do MongoDB dentro do Kafka com novos tutoriais!


Sep 17, 2024 | 1 min read
Tutorial

Ative seu MongoDB e BigQuery usando procedimentos armazenados do BigQuery Spark


Aug 12, 2024 | 5 min read
Sumário
  • Pré-requisitos