O blog da AWS
Como copiar dados do Azure Blob Storage para o Amazon S3 usando código
Visão geral da solução
O design usa o AWS Lambda para criar uma solução serverless. A comunicação entre as funções do AWS Lambda e o Azure usa o SDK do Azure para Python. Para oferecer suporte a essa comunicação, duas bibliotecas são necessárias: uma para lidar com identidade e outra para gerenciar armazenamento. Essas bibliotecas são implantadas como camadas Lambda separadas, permitindo que sejam facilmente reutilizadas em diferentes soluções.
Cada função do Lambda tem um trabalho específico, o que melhora a escalabilidade, o desempenho e a resiliência. As funções do Lambda interagem umas com as outras usando o Amazon Simple Notification Service (Amazon SNS) para um padrão de mensagens de publicação e assinatura.
Para acionar as funções do Lambda diariamente, o Amazon EventBridge emprega uma regra do EventBridge. O cronograma pode ser modificado para atender às suas necessidades específicas.
A sequência de eventos é ilustrada na Figura 1, com setas indicando a direção da invocação. A tabela 1 descreve a ordem dos eventos.
Figura 1: Serviços da AWS e ordem dos eventos
Etapa | Descrição |
1 | Uma tarefa agendada do EventBridge aciona uma função Lambda para iniciar o processo de cópia de dados. |
2 | As funções do Lambda consultam o AWS Secrets Manager para credenciais de autenticação e parâmetros de configuração do Azure. |
3 | As funções do Lambda se comunicam entre si usando tópicos do SNS. |
4 | As funções do Lambda solicitam um token OAUTH do Azure Active Directory via HTTPS. |
5 | As funções do Lambda interagem com o Azure Blob Storage via HTTPS. |
6 | As funções do Lambda carregam dados em um bucket do Amazon S3. |
Tabela 1: Ordem dos eventos
Os endpoints públicos do Armazenamento de Blobs do Azure são criptografados usando o Transport Layer Security (TLS) 1.2 por padrão. Isso garante que os dados sejam criptografados em trânsito. A partir de 5 de janeiro de 2023, todos os novos objetos enviados para o Amazon S3 são automaticamente criptografados com as chaves gerenciadas do Amazon S3 (SSE-S3). Nessa solução, empregamos criptografia do lado do servidor para o bucket usando o AWS Key Management Service (AWS KMS).
O acesso aos blobs do Azure de um serviço de aplicação principal é autorizado usando o Azure Active Directory. O ID da aplicação Azure, o ID do locatário e o segredo do cliente são armazenados com segurança no AWS Secrets Manager e recuperados pelas funções do Lambda conforme necessário.
O AWS Identity and Access Management (IAM) é um componente essencial de qualquer solução da AWS. Cada serviço da AWS só deve ter permissão para fazer o que precisa fazer no design. Refinamos as permissões para aplicar o princípio do menor privilégio.
A solução pode ser controlada usando dois parâmetros. O primeiro parâmetro, isactive, ativa ou desativa o processo de cópia. O segundo parâmetro, begindate, permite a modificação do requisito de idade mínima para os objetos a serem copiados. Para simplificar o design, esses parâmetros são armazenados no AWS Secrets Manager. As funções do Lambda podem recuperar com eficiência todos os dados necessários interagindo exclusivamente com o AWS Secrets Manager, com um impacto mínimo no custo (0,80 USD no momento da redação).
Para aumentar a observabilidade, um dashboard do Amazon CloudWatch combina métricas e registros em uma única visualização, permitindo a identificação rápida de problemas.
O processo de cópia é otimizado com base no tamanho do blob que está sendo copiado. Para blobs menores que 100 MB, as funções Lambda 1-3 são usadas, enquanto para objetos com mais de 100 MB de tamanho, as funções Lambda 1-6 são empregadas, conforme ilustrado na Figura 2.
Figura 2: Roteamento de objetos do Amazon S3
A Figura 3 ilustra a lógica implementada nas funções do Lambda e a Tabela 2 descreve a finalidade de cada função.
Figura 3: Lógica da função Lambda
Lambda | Propósito |
Lambda01 (qualificação de lançamento) | Verifique se o processo de cópia deve ser executado. |
Lambda02 (encontre blobs) | Encontre blobs do Azure que precisam ser copiados. |
Lambda03 (baixar) | Faz o download de blobs do Azure com menos de 100 MB de tamanho. |
Lamda04 (inicializador de arquivo grande) | Iniciado para blobs do Azure com mais de 100 MB de tamanho. Cria um manifesto manual de upload de várias partes em JSON. |
Lambda 05 (divide arquivos grandes) | Baixa blobs por intervalo de bytes como uma transferência para o fluxo de dados. |
Lambda 06 (recombinador de arquivos grandes) | Combina várias partes em objetos do Amazon S3 |
Tabela 2: Propósito da função Lambda
Omitimos alguns aspectos do design do diagrama e da tabela acima para manter a visão geral concisa. Por exemplo, adicionamos uma Amazon SNS dead-letter queue para ajudar na solução de falhas, o que não é mostrado na Figura 2.
Na próxima seção, mostraremos como implantar a solução.
Pré-requisitos
- Acesso a uma conta da AWS com permissões suficientes para criar os recursos na Figura 1.
- Uma conta de armazenamento do Azure e um contêiner de armazenamento de blobs que servirão como fonte para a transferência de dados.
- Azure Active Directory application and service principal. Anote o segredo da aplicação, que só é exibido durante a configuração.
- O responsável pelo serviço deve ter as funções de Colaborador de Dados do Blob de Armazenamento e Colaborador de Dados da Fila de Armazenamento atribuídas ao escopo da Conta de Armazenamento.
- A ID da aplicação e o Tenant ID do Azure Active Directory.
Observação: a cópia de arquivos do armazenamento de blobs do Azure para o Amazon S3 gera cobranças de saída de dados do Azure.
Passo a passo
O código deste blogpost está disponível em um repositório AWS Samples Git. No passo a passo a seguir, vamos nos concentrar em uma implantação do AWS CloudFormation. Este exercício levará cerca de 20 minutos para ser concluído.
Para implantar o AWS CloudFormation Stack:
- Baixe o código-fonte e extraia localmente. O arquivo contém um conjunto de pastas e arquivos. Você não precisa extrair arquivos zip individuais dentro das pastas.
- Faça upload de arquivos da pasta AzureBlobToAmazonS3Copy/CFN para um bucket do Amazon S3 de sua escolha. Esse será seu repositório de artefatos. A pasta contém os seguintes arquivos:
Camada Lambda azure-arm-identity.zip para identidade do Azure
Camada Lambda azure-arm-storage.zip para armazenamento do Azure
azs3copy-lambda01.zip – azs3copy-lambda06.zip Funções lambda de cópia de blob do Azure
azs3copy-stack.yaml Modelo do AWS CloudFormation
3. Depois que os arquivos tiverem sido carregados, copie a URL do objeto para azs3copy-stack.yaml, conforme mostrado na Figura 4:
Figura 4: Recuperando a localização do URL do objeto Amazon S3
- Siga esta documentação para criar uma nova stack do AWS CloudFormation. Ao escolher um modelo de stack, use a URL do objeto Amazon S3 que você copiou na etapa 2.
- Configure os parâmetros de implantação do AWS CloudFormation. As descrições e exemplos de parâmetros estão incluídos no modelo do CloudFormation. Não altere as configurações avançadas — elas são atualmente experimentais.
- A implantação levará de 5 a 10 minutos. Ao terminar, uma mensagem CREATE_COMPLETE é exibida conforme ilustrado na Figura 5.
Figura 5: Mensagem completa da Stack do AWS CloudFormation
A solução agora está configurada e pronta. Ele será executado automaticamente com base na programação especificada nos parâmetros. Se você deseja iniciar uma cópia imediatamente, vá para a próxima seção.
Inicializar uma cópia manual dos dados
- Navegue até o console do AWS Secrets Manager e escolha o segredo criado pela implantação. Na Figura 6, você pode ver que usamos “etl” como código de prefixo.
Figura 6: Localizando o segredo no AWS Secrets Manager
- Escolha Recuperar valor secreto, conforme mostrado na Figura 7.
Figura 7: Botão de recuperação de valor secreto de localização
- Observe a tecla para isactive. Alterar o valor para False desativará o processo de cópia. Revise a chave para begindate, conforme ilustrado na Figura 8. Essa é a idade mínima dos objetos a serem copiados. Certifique-se de que ele atenda às suas necessidades.
Figura 8: Configuração secreta do AWS Secret Manager
- Navegue até o AWS Lambda
- Pesquise as funções do Lambda criadas pela implantação. Na Figura 9, você pode ver que usamos “etl” como código de prefixo
Figura 9: Seleção de soluções: Funções Lambda
- Escolha a função com lambda01 no nome, conforme mostrado na Figura 10. O código Python estará visível no console.
Figura 10: Selecionando lambda01
- Selecione a guia Teste e escolha Teste conforme ilustrado na Figura 11.
Figura 11: Visualizando o código Python da função Lambda
- Você deve receber uma mensagem Resultado de execução: êxito, conforme ilustrado na Figura 12.
Figura 12: A execução da função Lambda foi bem-sucedida
- Navegue até o bucket do Amazon S3 criado pela implantação. O nome do bucket começará com o nome da stack do AWS CloudFormation, conforme ilustrado na Figura 13. Os arquivos começarão a aparecer no diretório. Atualize a página para verificar o progresso.
Figura 13: Localizando objetos copiados no Amazon S3
Solução de problemas
Se não houver arquivos no bucket de destino, você pode verificar se há erros no dashboard do Amazon CloudWatch.
- Navegue até o Amazon CloudWatch.
- Selecione Dashboards à esquerda e escolha o painel criado pela implantação, conforme ilustrado na Figura 14. Neste exemplo, usamos “etl” como código de prefixo.
Figura 14: Localizando o painel do Amazon CloudWatch
- Um dashboard é exibido conforme mostrado na Figura 15. Analise os dados nos widgets para identificar possíveis erros, como segredos incorretos do aplicativo Azure ou permissões insuficientes para a conta do Azure Blob Storage.
Figura 15: Uma visão do painel do Amazon CloudWatch
No exemplo acima, copiamos 76 arquivos, totalizando 122,11 GB em 7,32 segundos.
Limpeza
Antes de excluir a stack do AWS CloudFormation, você precisará esvaziar o bucket do Amazon S3.
- Navegue até o Amazon S3 no Console de Gerenciamento da AWS.
- Escolha o bucket do Amazon S3 criado durante a implantação e verifique seu conteúdo. Você pode querer manter os dados para uso futuro. Se você quiser reter os arquivos, mova a pasta para outro bucket do Amazon S3.
- Quando estiver pronto, selecione o bucket do Amazon S3 e escolha Empty, conforme ilustrado na Figura 16.
Figura 16: Esvaziando o bucket do Amazon S3
- Siga as instruções na tela para confirmar a ação.
- Por fim, siga esta documentação para excluir o modelo do AWS CloudFormation.
Conclusão
Neste BlogPost, mostramos como você pode usar os serviços da AWS para criar um aplicativo serverless que copia dados do Azure Blob Storage para o Amazon S3 de maneira eficiente e econômica.
Este artigo foi traduzido do Blog da AWS em Inglês.
Sobre o autor
Mo Mohoboob é arquiteto sênior de soluções na AWS, especializado em cargas de trabalho da Microsoft. Mo tem paixão por tornar as coisas simples para os clientes usarem. Ele é um defensor do DevOps e adora criar soluções que ajudem os clientes a se moverem mais rapidamente. Em seu tempo livre, Mo gosta de estar ao ar livre, fazer caminhadas, jardinar e viajar para destinos distantes e fora dos roteiros mais conhecidos.
Chris Schoerning é arquiteto de soluções especialista na AWS. Ele é um defensor excêntrico do desenvolvimento de soluções Database First devido à sua experiência em desenvolvimento de banco de dados e desenvolvimento de aplicativos. Ele gosta de simplificar os processos, inicialmente complicando-os demais e depois reduzindo-os às partes necessárias. Banana.