SlideShare uma empresa Scribd logo
1 de 70
Baixar para ler offline
São Paulo
Amazon CloudSearch Avançado
Fábio Aragão da Silva, Solutions Architect at AWS
David Lojudice Sb, Chief Technology Officer at SCUP
28 de Maio de 2015
Agenda
• Busca
• Configuração / Preparo
• Escalabilidade
• Consultas
• Arquitetura
• SCUP
Busca
Busca em Geral
Dados
Consulta Engajamento
Resultados
Busca no Amazon CloudSearch
• Disponibilizado a partir do motor A9
• Clientes pediram mais funcionalidades
• Primeiro passo: Apache Solr como novo motor
de busca
• A missão: gerenciar os detalhes operacionais
Dica #1
Migre para a API 2013
API 2013 do CloudSearch
• Mais funcionalidades e desenvolvimento
contínuo
• Custo mais baixo
• Suporte a muitas funcionalidades do Solr
– Mais tipos de dados: float, date, geo, signed integer
– Múltiplas línguas
– Funcionalidades de UI: Highlighting, sugestões
– Funcionalidades do Solr: boosting, fuzzy, sloppy phrases
– Funcionalidades Operacionais: IAM, CLI, escalabilidade
Configuração / Preparo
Amazon
CloudSearch
Crie batches
Proteja seu domínio
Consultas
Carga
Monitore seu domínio
Crie seu domínio
Configuração e Preparo
Criando e Configurando um Domínio
aws cloudsearch create-domain
--domain-name twitter-sm
aws cloudsearch define-index-field
--domain-name twitter-sm
--name text
--type text
aws cloudsearch define-index-field
--domain-name twitter-sm
--name hashtags
--type literal-array
aws cloudsearch define-index-field
--domain-name twitter-sm
--name timestamp_ms --type int
etc...
Convertendo Dados
def _convert_tweet(r):
clean_r = _clean_record(r) # remove bad Unicode
doc = sdf.SDFDoc()
doc.docid = clean_r['id'] # Identify the document's ID
# Process document sub-parts
if clean_r.has_key('entities'):
_parse_and_add_entities(clean_r, doc)
if clean_r.has_key('user'):
_parse_and_add_user_data(clean_r, doc)
# Remove unwanted portions of the source data
if clean_r.has_key('retweeted_status'):
clean_r.pop('retweeted_status', None)
if clean_r.has_key('sizes'):
clean_r.pop('sizes', None)
doc.add_fields(**clean_r)
return doc
Dica #2
Faça uso de batches sempre
que possível
Criando Batches
for filename in dirwalk(sourcedir): # Or streaming, or DB, or...
with open(filename, 'r') as f:
for l in f:
batch.add_doc(_convert_tweet(l))
if batch.size > sdf_size:
flush_batch(batch)
Usando a AWS CLI para fazer upload
aws cloudsearchdomain upload-documents
--documents <filename>
--endpoint 'http://<doc endpoint>'
--content-type 'application/json'
{
"status": "success",
"adds": 5684,
"deletes": 0
}
Dica #3
Proteja e monitore seu domínio
Boas práticas de segurança
• Controle de forma cuidadosa o acesso ao
serviço de documento (indexação)
• Os serviços de busca e sugestão necessitam de
acesso mais amplo
• Utilize políticas de acesso diferentes para
diferentes classes de usuários administrativos
Proteja seu domínio por usuário
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": ["*"]},
"Action": [
"cloudsearch:search",
"cloudsearch:suggest"
]
}
]
}
Proteja seu domínio por recurso
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["cloudsearch:search", "cloudsearch:document"],
"Resource":
"arn:aws:cloudsearch:us-east-1:111122223333:domain/tweets"
}
]
}
Integração com AWS CloudTrail
• Describe*
• Update*
• Delete*
AWS CloudTrail
{
"eventVersion": "1.01",
"userIdentity": {"type": "Root", "principalId": "...", "arn": "...", "accountId": "...", "accessKeyId":
"..."},
"eventTime": "2014-10-27T20:53:07Z",
"eventSource": "cloudsearch.amazonaws.com",
"eventName": "DescribeDomains",
"awsRegion": "us-east-1",
"sourceIPAddress": "...",
"userAgent": "aws-sdk-java/Linux/2.6.18-164.el5 Java_HotSpot(TM)_64-Bit/23.25-b01/1.7.0_25",
"requestParameters": {"domainNames": ["twitter-geo"]},
"responseElements": null,
"requestID": "40d6953b-5e1b-11e4-ae8f-97e54e307088",
"eventID": "9835fa54-b8d3-4fb0-ac6e-ef1403069f7b"
},
Escalabilidade
Dica #4
Aumente o tipo de instância
quando precisar indexar uma
carga grande de documentos
Escalando o CloudSearch
• Escale pra cima para suportar a
carga/indexação inicial
• Volte ao tamanho adequado para o tráfego
normal
• Faça pré-aquecimento para aumentos previstos
de tráfego
Escalando por volume de dados
Small
Large
XLarge
2XLarge
2XLarge
(P1)
2XLarge
(P2)
Aumento no volume de dados
E quão grande?
Tipo de Instância
Dados do Twitter
(apenas a busca)
Dados do Common-crawl
(apenas a busca)
search.m1.small
6.7 GB, 4.7 milhões de
documentos
4 GB, 625 mil
documentos
search.m1.large
26.8 GB, 18.8 milhões
de documentos
16 GB, 2.5 milhões de
documentos
search.m2.xlarge
53.6 GB, 37.6 milhões
de documentos
34 GB, 5 milhões de
documentos
search.m2.2xlarge*
107.2 GB, 75.2 milhões
de documentos
64 GB, 10 milhões de
documentos
Compressão dos índices
Documentos
Origem
Índice Nós do Amazon
CloudSearch
Tamanho dos índices
Nenhum
opção
Todas as
opções
Highlight Retorno Ordenação Faceta
Partições 5 2xl 7 2xl 7 2xl 5 2xl 5 2xl 5 2xl
Aumento 0% 243% 220.8% 153.2% 12.7% 0.3%
Indexação multi-thread
Tipo da Instância Threads da Instância Threads de Conexão
search.m1.small 2 1
search.m1.large 5 3
search.m2.xlarge 9 5
search.m2.2xlarge* 17 9
Exemplo
150 GB
Dados
64 GB RAM
search.m2.2xlarge
3 Partições de m2.2xlarge
27 threads (no máximo)
Processo de carga de dados
aws cloudsearch update-scaling-parameters
--domain-name foo
--scaling-parameters DesiredInstanceType=search.m2.2xlarge,
DesiredPartitionCount=3
aws cloudsearch index-documents
--domain-name foo
E após carregar os dados...
aws cloudsearch update-scaling-parameters
--domain-name foo
--scaling-parameters DesiredInstanceType=search.m1.small,
DesiredPartitionCount=1
Dica #5
Faça pré-aquecimento para
picos de acesso
Escalando a partir de consultas
search
request
volume and
complexity
SEARCH INSTANCE
Index Partition 1
Replica 1
SEARCH INSTANCE
Index Partition 2
Replica 1
SEARCH INSTANCE
Index Partition n
Replica 1
SEARCH INSTANCE
Index Partition 1
Replica 2
SEARCH INSTANCE
Index Partition 2
Replica 2
SEARCH INSTANCE
Index Partition n
Replica 2
SEARCH INSTANCE
Index Partition 1
Replica n
SEARCH INSTANCE
Index Partition 2
Replica n
SEARCH INSTANCE
Index Partition n
Replica n
Escalando a partir de consultas
Tipo de Instância Threads JMeter
Throughput
do Twitter
Throughput
da Common Crawl
search.m1.small 20
2 hosts
10 threads
25.1 qps
397 ms
48.3 qps
206 ms
search.m1.large 20
4 hosts
20 threads
108.5 qps
183 ms
291.5 qps
68 ms
search.m2.xlarge 20
8 hosts
40 threads
419.6 qps
94 ms
665.9 qps
59 ms
search.m2.2xlarge 20
16 hosts
80 threads
566.4 qps
140 ms
985.3 qps
80 ms
30 qps20 qps10 qps5 qps60 qps
Index Partition 1
Replica 3
SEARCH m1.small
Exemplo
???
?
? ?
?
???
?
? ?
?
???
?
? ?
?
???
?
? ?
????
?
? ?
?
???
?
? ?
?
SEARCH.m1.small
Index Partition 1
Replica 1
SEARCH.m1.small
Index Partition 1
Replica 2
SEARCH m1.small
Index Partition 1
Replica 1
SEARCH m1.small
Index Partition 1
Replica 2
SEARCH m1.small
Index Partition 1
Replica 1
??
?
40 qps50 qps
Consultas
Consultas Simples
{"status": { "rid": "i8TQupgpEQocRhU=","time-ms": 3},
"hits": {"found": 9234, "start": 0,
"hit": [
{
"id": "523254764427952129",
"fields": {
"text": "idk if its yummy or what lol im hungry"
}
},...
http://<endpoint>/2013-01-01/search?q=idk
Consultas Estruturadas
{"status": { "rid": "lPfcupgpFAocRhU=","time-ms": 4},
"hits": {"found": 6235, "start": 0,
"hit": [
{
"id": "523260481096540160",
"fields": {
"text": "idk what it is but ... something's different"
}
},...
http://<endpoint>/2013-01-01/search?q=(and 'idk'
country:'United States')&q.parser=structured
Outras Opções de Consulta
{"status": { "rid": "9MPvupgpFwocRhU=","time-ms": 2},
"hits": {"found": 8997, "start": 0,
"hit": [
{
"id": "523303605575909376",
"fields": {
"text": "Idk ... Idk idk idk idk idk idk"
}
},...
http://<endpoint>/2013-01-01/search?q=idk
&q.parser=structured&q.options={fields:['text^4','us
er_description^0.5']}
Filtro Geográfico
{"status": { "rid": "+r6Wh5gpBgocRhU=","time-ms": 2},
"hits": {"found": 78, "start": 0,
"hit": [
{
"id": "523341488005345280",
"fields": {
"text": "I love talking baseball with my dad"
}
},...
fq=geo:['37.8324,-122.3553','37.6040,-123.0137']&
q='baseball'&q.parser=structured&return=text
Dica #6
Utilize o parâmetro de filtragem
(fq) sempre que possível
Filtro versus Consulta
• Filtros não contribuem
para o ranqueamento
• Filtros podem ser
mais rápidos
• Filtros suportam
linguagem estruturada
de consulta Times include HTTP transport
0
50
100
150
200
250
q= fq= fq= (10 Queries)
TotalQueryLatency,Milliseconds
Query Condi on
p50
Average
p90
Ordenação Geográfica
{"status": { "rid": "+vtjHjJgpDwocRhU=","time-ms": 41},
"hits": {"found": 78, "start": 0,
"hit": [
{
"id": "523310760416378881",
"fields": {
"text": "Still can't believe it! What a game!
@sfgiants #worldseries @ AT&amp;T Park http://t.co/TTNP7CPHHP"
}
},...
expr.dist=haversin(37.7786,-
122.3892,geo.latitude,geo.longitude)&sort=dist asc&
q='baseball'&q.parser=structured&return=text
Boosting
baseball
(or 'baseball' (term
field='hashtags' boost=4
'sfgiants'))
• Great Day of Baseball here
at the Junior Fall Classic
• Good Morning! Fall
#Baseball.
#HuntingtonPark
• Beautiful Saturday morning
for baseball in Norfolk.
• A day off. Pretty nice to
have one sometimes. No
teaching, no #baseball
• One word to describe 9th
inning....baseball. #SFGiants
• I'm on a #SFGiants high.
Listening to analysis...
• @RealTimers @thejoelstein
Unless it's #SFGiants...
• Apropos of nothing:
#SFGiants are in the Big
Show again...
Suporte a Múltiplos Idiomas
Suporte a Múltiplos Idiomas
Dica #7
Use o AWS SDK ou CLI para
consultar o CloudSearch
Usando o AWS SDK
AmazonCloudSearchDomainClient client =
new AmazonCloudSearchDomainClient(
new ProfileCredentialsProvider("user_profile”));
client.setEndpoint(endpoint);
SearchRequest search = new SearchRequest();
search.setQuery(query);
SearchResult results = client.search(search);
Usando a AWS CLI
{"status": { "rid": "wdzc35cpBgoupzc=","time-ms": 4},
"hits": {"found": 20622, "start": 0,
"hit": [
{
"id": "523897644771733504",
"fields": {
"text": "idk if its yummy or what lol im hungry"
}
},...
$ aws cloudsearchdomain search --search-query
'idk' --endpoint 'http://<endpoint>/'
Arquitetura
Dica #8
Use Cache para Melhorar a
Performance e Diminuir os
Custos
Arquitetura com Cache
Amazon
ElastiCache
Amazon
CloudSearch
Application
servers
1
2, 5
3
4
Dica #9
Crie arquiteturas multi-tenancy
(para “múltiplos vizinhos”)
Dados Heterogêneos
Cliente 1 Cliente 2 Cliente 3
Idioma 1 Idioma 2 Idioma 3
Tipo 1 Tipo 2 Tipo 3
Solução 1 – Domínio Único
..."customer_id":"12d4efd56"...
fq=customer_id:'12d4efd56'
Solução 2 – Múltiplos Domínios
http://endpoint1, http://endpoint2, http://endpoint3
Melhores Práticas
• Escolha a abordagem de domínio único quando
o número de vizinhos for grande
• Escolha a abordagem de múltiplos domínios
quando existe grande variação de escala ou
configuração entre os vizinhos
• Escolha uma abordagem híbrida (quando fizer
sentido) para minimizar o custo e maximizar a
performance
Dica #10
Minere comportamento do
usuário para aprimorar os
resultados da busca
Monitoramento do Comportamento de
Usuário
Servidores
de Aplicação
Amazon
Redshift
Informaçòes de Sessão
Consultas/Resultados
Cliques
Compras
Amazon
CooudSearch
Amazon
EMR
Banco da
Aplicação
Processamento
O Que é Possível Fazer com Comportamento
de Usuário?
• Boosting de documentos
• Enriquecimento de documentos
• Criação de sinônimos
• Etc…
• Multinacional Brasileira
• 5 anos, Pioneira e Líder de Mercado
• Certificada pelo Facebook e pelo Twitter
• Parceira do Google+, Facebook e Twitter
• Presente em 40 das 100 Maiores
Empresas do Brasil*
“Queremos focar
nas
funcionalidades
desejadas pelos
clientes”
David Lojudice, CTO do
Scup
Fonte: Revista Exame
• “Near real-time search”: busca
em documentos recém-
indexados
• Mínimo esforço do time de
DevOps.
• Volume crescente de buscas
• Volume crescente de indexação
O Desafio
• Solução Inicial (primeiro ano da empresa)
• Problemas:
– Performance
– Não permitia filtros complexos
– Não escala
1a. Geração – MySQL Full Text
Search
Amazon EC2
Crawlers
• Entendemos que precisávamos de um search engine (segundo ano
da empresa)
• Problemas:
– Não escala
– Instabilidade (índice corrompia)
– Demandava tempo significativo da equipe de DevOps
2a. Geração - Sphinx
Amazon EC2
Crawlers
• “Near real-time search”
• Escala (volume, buscas e indexação)
• Baixa demanda do time de DevOps.
3a. Geração - CloudSeach
Amazon RDS
MySQL
Amazon EC2
Crawlers
Amazon
CloudSearch
• 300 milhões de documentos
• 400 mil queries / dia
• 300 mil indexações / dia
• 17 instâncias search.m2.2xlarge
CloudSearch no Scup
• Migre para a API 2013
• Mais barato, melhor integração – AWS SDK, AWS CLI
• Use o máximo que puder de batches para obter a
melhor performance durante indexações
• Escale manualmente quando for carregar dados de
forma massiva e em picos de consulta
• Features do Solr possibilitam queries mais avançadas
• Crie domínios “multi-tenant”, use filtros, diferentes
idiomas, etc.
Resumo
Leitura
• aws.amazon.com/documentation/cloudsearch/
Comunidade e suporte:
• awshub.com.br
• forums.aws.amazon.com
• aws.amazon.com/support
Treinamento
• qwiklabs.com/focuses/preview/1269
Próximos Passos
Fábio Aragão da Silva, Solutions Architect – AWS
São Paulo

Mais conteúdo relacionado

Semelhante a Cloud search avancado

MVP Conf 2018 - Pesquisa e Indexação de Documento com Azure Search
MVP Conf 2018 - Pesquisa e Indexação de Documento com Azure SearchMVP Conf 2018 - Pesquisa e Indexação de Documento com Azure Search
MVP Conf 2018 - Pesquisa e Indexação de Documento com Azure SearchRafael Cruz, MCT, MBA
 
Building blocks #4 - Rede de entrega de conteúdo (CDN) na AWS
Building blocks #4 - Rede de entrega de conteúdo (CDN) na AWSBuilding blocks #4 - Rede de entrega de conteúdo (CDN) na AWS
Building blocks #4 - Rede de entrega de conteúdo (CDN) na AWSAmazon Web Services LATAM
 
Work Cloud - Descobrindo o Microsoft Azure
Work Cloud - Descobrindo o Microsoft AzureWork Cloud - Descobrindo o Microsoft Azure
Work Cloud - Descobrindo o Microsoft AzureLucas Chies
 
Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...
Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...
Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...Amazon Web Services LATAM
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
Copa do mundo no brasil interagindo com os torcedores em tempo real
Copa do mundo no brasil   interagindo com os torcedores em tempo realCopa do mundo no brasil   interagindo com os torcedores em tempo real
Copa do mundo no brasil interagindo com os torcedores em tempo realAmazon Web Services LATAM
 
2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedores2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedoresJardel Weyrich
 
Visão estratégica de como migrar para a cloud
Visão estratégica de como migrar para a cloudVisão estratégica de como migrar para a cloud
Visão estratégica de como migrar para a cloudAmazon Web Services
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...tdc-globalcode
 
Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...
Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...
Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...Amazon Web Services LATAM
 
Banco de dados na nuvem e isso é possível
Banco de dados na nuvem e isso é possívelBanco de dados na nuvem e isso é possível
Banco de dados na nuvem e isso é possívelMarcos Freccia
 
Escalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuáriosEscalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuáriosAmazon Web Services LATAM
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningFelipe Santos
 
Como construir sua primeira aplicação de Big Data na AWS
Como construir sua primeira aplicação de Big Data na AWSComo construir sua primeira aplicação de Big Data na AWS
Como construir sua primeira aplicação de Big Data na AWSAmazon Web Services LATAM
 

Semelhante a Cloud search avancado (20)

MVP Conf 2018 - Pesquisa e Indexação de Documento com Azure Search
MVP Conf 2018 - Pesquisa e Indexação de Documento com Azure SearchMVP Conf 2018 - Pesquisa e Indexação de Documento com Azure Search
MVP Conf 2018 - Pesquisa e Indexação de Documento com Azure Search
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Building blocks #4 - Rede de entrega de conteúdo (CDN) na AWS
Building blocks #4 - Rede de entrega de conteúdo (CDN) na AWSBuilding blocks #4 - Rede de entrega de conteúdo (CDN) na AWS
Building blocks #4 - Rede de entrega de conteúdo (CDN) na AWS
 
Work Cloud - Descobrindo o Microsoft Azure
Work Cloud - Descobrindo o Microsoft AzureWork Cloud - Descobrindo o Microsoft Azure
Work Cloud - Descobrindo o Microsoft Azure
 
Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...
Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...
Usando Amazon CloudFront para aumentar performance, disponibilidade e cache n...
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
Copa do mundo no brasil interagindo com os torcedores em tempo real
Copa do mundo no brasil   interagindo com os torcedores em tempo realCopa do mundo no brasil   interagindo com os torcedores em tempo real
Copa do mundo no brasil interagindo com os torcedores em tempo real
 
Infraestrutura como codigo
Infraestrutura como codigoInfraestrutura como codigo
Infraestrutura como codigo
 
2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedores2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedores
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
Visão estratégica de como migrar para a cloud
Visão estratégica de como migrar para a cloudVisão estratégica de como migrar para a cloud
Visão estratégica de como migrar para a cloud
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
 
Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...
Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...
Escalabilidade para sua solução na Nuvem da AWS de um para centenas de milhõe...
 
Banco de dados na nuvem e isso é possível
Banco de dados na nuvem e isso é possívelBanco de dados na nuvem e isso é possível
Banco de dados na nuvem e isso é possível
 
Azure Fundamentals
Azure FundamentalsAzure Fundamentals
Azure Fundamentals
 
Escalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuáriosEscalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuários
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine Learning
 
Como construir sua primeira aplicação de Big Data na AWS
Como construir sua primeira aplicação de Big Data na AWSComo construir sua primeira aplicação de Big Data na AWS
Como construir sua primeira aplicação de Big Data na AWS
 
Azure @ Rio Cloud Meetup
Azure @ Rio Cloud MeetupAzure @ Rio Cloud Meetup
Azure @ Rio Cloud Meetup
 

Mais de Amazon Web Services LATAM

AWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvemAWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvemAmazon Web Services LATAM
 
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e BackupAWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e BackupAmazon Web Services LATAM
 
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.Amazon Web Services LATAM
 
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvemAWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvemAmazon Web Services LATAM
 
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e BackupAWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e BackupAmazon Web Services LATAM
 
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.Amazon Web Services LATAM
 
Automatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAutomatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAmazon Web Services LATAM
 
Automatize seu processo de entrega de software com CI/CD na AWS
Automatize seu processo de entrega de software com CI/CD na AWSAutomatize seu processo de entrega de software com CI/CD na AWS
Automatize seu processo de entrega de software com CI/CD na AWSAmazon Web Services LATAM
 
Ransomware: como recuperar os seus dados na nuvem AWS
Ransomware: como recuperar os seus dados na nuvem AWSRansomware: como recuperar os seus dados na nuvem AWS
Ransomware: como recuperar os seus dados na nuvem AWSAmazon Web Services LATAM
 
Ransomware: cómo recuperar sus datos en la nube de AWS
Ransomware: cómo recuperar sus datos en la nube de AWSRansomware: cómo recuperar sus datos en la nube de AWS
Ransomware: cómo recuperar sus datos en la nube de AWSAmazon Web Services LATAM
 
Aprenda a migrar y transferir datos al usar la nube de AWS
Aprenda a migrar y transferir datos al usar la nube de AWSAprenda a migrar y transferir datos al usar la nube de AWS
Aprenda a migrar y transferir datos al usar la nube de AWSAmazon Web Services LATAM
 
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWS
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWSAprenda como migrar e transferir dados ao utilizar a nuvem da AWS
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWSAmazon Web Services LATAM
 
Cómo mover a un almacenamiento de archivos administrados
Cómo mover a un almacenamiento de archivos administradosCómo mover a un almacenamiento de archivos administrados
Cómo mover a un almacenamiento de archivos administradosAmazon Web Services LATAM
 
Os benefícios de migrar seus workloads de Big Data para a AWS
Os benefícios de migrar seus workloads de Big Data para a AWSOs benefícios de migrar seus workloads de Big Data para a AWS
Os benefícios de migrar seus workloads de Big Data para a AWSAmazon Web Services LATAM
 

Mais de Amazon Web Services LATAM (20)

AWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvemAWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
 
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e BackupAWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
 
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
 
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvemAWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
 
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e BackupAWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
 
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
 
Automatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAutomatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWS
 
Automatize seu processo de entrega de software com CI/CD na AWS
Automatize seu processo de entrega de software com CI/CD na AWSAutomatize seu processo de entrega de software com CI/CD na AWS
Automatize seu processo de entrega de software com CI/CD na AWS
 
Cómo empezar con Amazon EKS
Cómo empezar con Amazon EKSCómo empezar con Amazon EKS
Cómo empezar con Amazon EKS
 
Como começar com Amazon EKS
Como começar com Amazon EKSComo começar com Amazon EKS
Como começar com Amazon EKS
 
Ransomware: como recuperar os seus dados na nuvem AWS
Ransomware: como recuperar os seus dados na nuvem AWSRansomware: como recuperar os seus dados na nuvem AWS
Ransomware: como recuperar os seus dados na nuvem AWS
 
Ransomware: cómo recuperar sus datos en la nube de AWS
Ransomware: cómo recuperar sus datos en la nube de AWSRansomware: cómo recuperar sus datos en la nube de AWS
Ransomware: cómo recuperar sus datos en la nube de AWS
 
Ransomware: Estratégias de Mitigação
Ransomware: Estratégias de MitigaçãoRansomware: Estratégias de Mitigação
Ransomware: Estratégias de Mitigação
 
Ransomware: Estratégias de Mitigación
Ransomware: Estratégias de MitigaciónRansomware: Estratégias de Mitigación
Ransomware: Estratégias de Mitigación
 
Aprenda a migrar y transferir datos al usar la nube de AWS
Aprenda a migrar y transferir datos al usar la nube de AWSAprenda a migrar y transferir datos al usar la nube de AWS
Aprenda a migrar y transferir datos al usar la nube de AWS
 
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWS
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWSAprenda como migrar e transferir dados ao utilizar a nuvem da AWS
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWS
 
Cómo mover a un almacenamiento de archivos administrados
Cómo mover a un almacenamiento de archivos administradosCómo mover a un almacenamiento de archivos administrados
Cómo mover a un almacenamiento de archivos administrados
 
Simplifique su BI con AWS
Simplifique su BI con AWSSimplifique su BI con AWS
Simplifique su BI con AWS
 
Simplifique o seu BI com a AWS
Simplifique o seu BI com a AWSSimplifique o seu BI com a AWS
Simplifique o seu BI com a AWS
 
Os benefícios de migrar seus workloads de Big Data para a AWS
Os benefícios de migrar seus workloads de Big Data para a AWSOs benefícios de migrar seus workloads de Big Data para a AWS
Os benefícios de migrar seus workloads de Big Data para a AWS
 

Cloud search avancado

  • 2. Amazon CloudSearch Avançado Fábio Aragão da Silva, Solutions Architect at AWS David Lojudice Sb, Chief Technology Officer at SCUP 28 de Maio de 2015
  • 3. Agenda • Busca • Configuração / Preparo • Escalabilidade • Consultas • Arquitetura • SCUP
  • 5. Busca em Geral Dados Consulta Engajamento Resultados
  • 6. Busca no Amazon CloudSearch • Disponibilizado a partir do motor A9 • Clientes pediram mais funcionalidades • Primeiro passo: Apache Solr como novo motor de busca • A missão: gerenciar os detalhes operacionais
  • 7. Dica #1 Migre para a API 2013
  • 8. API 2013 do CloudSearch • Mais funcionalidades e desenvolvimento contínuo • Custo mais baixo • Suporte a muitas funcionalidades do Solr – Mais tipos de dados: float, date, geo, signed integer – Múltiplas línguas – Funcionalidades de UI: Highlighting, sugestões – Funcionalidades do Solr: boosting, fuzzy, sloppy phrases – Funcionalidades Operacionais: IAM, CLI, escalabilidade
  • 10. Amazon CloudSearch Crie batches Proteja seu domínio Consultas Carga Monitore seu domínio Crie seu domínio Configuração e Preparo
  • 11. Criando e Configurando um Domínio aws cloudsearch create-domain --domain-name twitter-sm aws cloudsearch define-index-field --domain-name twitter-sm --name text --type text aws cloudsearch define-index-field --domain-name twitter-sm --name hashtags --type literal-array aws cloudsearch define-index-field --domain-name twitter-sm --name timestamp_ms --type int etc...
  • 12. Convertendo Dados def _convert_tweet(r): clean_r = _clean_record(r) # remove bad Unicode doc = sdf.SDFDoc() doc.docid = clean_r['id'] # Identify the document's ID # Process document sub-parts if clean_r.has_key('entities'): _parse_and_add_entities(clean_r, doc) if clean_r.has_key('user'): _parse_and_add_user_data(clean_r, doc) # Remove unwanted portions of the source data if clean_r.has_key('retweeted_status'): clean_r.pop('retweeted_status', None) if clean_r.has_key('sizes'): clean_r.pop('sizes', None) doc.add_fields(**clean_r) return doc
  • 13. Dica #2 Faça uso de batches sempre que possível
  • 14. Criando Batches for filename in dirwalk(sourcedir): # Or streaming, or DB, or... with open(filename, 'r') as f: for l in f: batch.add_doc(_convert_tweet(l)) if batch.size > sdf_size: flush_batch(batch)
  • 15. Usando a AWS CLI para fazer upload aws cloudsearchdomain upload-documents --documents <filename> --endpoint 'http://<doc endpoint>' --content-type 'application/json' { "status": "success", "adds": 5684, "deletes": 0 }
  • 16. Dica #3 Proteja e monitore seu domínio
  • 17. Boas práticas de segurança • Controle de forma cuidadosa o acesso ao serviço de documento (indexação) • Os serviços de busca e sugestão necessitam de acesso mais amplo • Utilize políticas de acesso diferentes para diferentes classes de usuários administrativos
  • 18. Proteja seu domínio por usuário { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": ["*"]}, "Action": [ "cloudsearch:search", "cloudsearch:suggest" ] } ] }
  • 19. Proteja seu domínio por recurso { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["cloudsearch:search", "cloudsearch:document"], "Resource": "arn:aws:cloudsearch:us-east-1:111122223333:domain/tweets" } ] }
  • 20. Integração com AWS CloudTrail • Describe* • Update* • Delete* AWS CloudTrail { "eventVersion": "1.01", "userIdentity": {"type": "Root", "principalId": "...", "arn": "...", "accountId": "...", "accessKeyId": "..."}, "eventTime": "2014-10-27T20:53:07Z", "eventSource": "cloudsearch.amazonaws.com", "eventName": "DescribeDomains", "awsRegion": "us-east-1", "sourceIPAddress": "...", "userAgent": "aws-sdk-java/Linux/2.6.18-164.el5 Java_HotSpot(TM)_64-Bit/23.25-b01/1.7.0_25", "requestParameters": {"domainNames": ["twitter-geo"]}, "responseElements": null, "requestID": "40d6953b-5e1b-11e4-ae8f-97e54e307088", "eventID": "9835fa54-b8d3-4fb0-ac6e-ef1403069f7b" },
  • 22. Dica #4 Aumente o tipo de instância quando precisar indexar uma carga grande de documentos
  • 23. Escalando o CloudSearch • Escale pra cima para suportar a carga/indexação inicial • Volte ao tamanho adequado para o tráfego normal • Faça pré-aquecimento para aumentos previstos de tráfego
  • 24. Escalando por volume de dados Small Large XLarge 2XLarge 2XLarge (P1) 2XLarge (P2) Aumento no volume de dados
  • 25. E quão grande? Tipo de Instância Dados do Twitter (apenas a busca) Dados do Common-crawl (apenas a busca) search.m1.small 6.7 GB, 4.7 milhões de documentos 4 GB, 625 mil documentos search.m1.large 26.8 GB, 18.8 milhões de documentos 16 GB, 2.5 milhões de documentos search.m2.xlarge 53.6 GB, 37.6 milhões de documentos 34 GB, 5 milhões de documentos search.m2.2xlarge* 107.2 GB, 75.2 milhões de documentos 64 GB, 10 milhões de documentos
  • 27. Tamanho dos índices Nenhum opção Todas as opções Highlight Retorno Ordenação Faceta Partições 5 2xl 7 2xl 7 2xl 5 2xl 5 2xl 5 2xl Aumento 0% 243% 220.8% 153.2% 12.7% 0.3%
  • 28. Indexação multi-thread Tipo da Instância Threads da Instância Threads de Conexão search.m1.small 2 1 search.m1.large 5 3 search.m2.xlarge 9 5 search.m2.2xlarge* 17 9
  • 29. Exemplo 150 GB Dados 64 GB RAM search.m2.2xlarge 3 Partições de m2.2xlarge 27 threads (no máximo)
  • 30. Processo de carga de dados aws cloudsearch update-scaling-parameters --domain-name foo --scaling-parameters DesiredInstanceType=search.m2.2xlarge, DesiredPartitionCount=3 aws cloudsearch index-documents --domain-name foo E após carregar os dados... aws cloudsearch update-scaling-parameters --domain-name foo --scaling-parameters DesiredInstanceType=search.m1.small, DesiredPartitionCount=1
  • 31. Dica #5 Faça pré-aquecimento para picos de acesso
  • 32. Escalando a partir de consultas search request volume and complexity SEARCH INSTANCE Index Partition 1 Replica 1 SEARCH INSTANCE Index Partition 2 Replica 1 SEARCH INSTANCE Index Partition n Replica 1 SEARCH INSTANCE Index Partition 1 Replica 2 SEARCH INSTANCE Index Partition 2 Replica 2 SEARCH INSTANCE Index Partition n Replica 2 SEARCH INSTANCE Index Partition 1 Replica n SEARCH INSTANCE Index Partition 2 Replica n SEARCH INSTANCE Index Partition n Replica n
  • 33. Escalando a partir de consultas Tipo de Instância Threads JMeter Throughput do Twitter Throughput da Common Crawl search.m1.small 20 2 hosts 10 threads 25.1 qps 397 ms 48.3 qps 206 ms search.m1.large 20 4 hosts 20 threads 108.5 qps 183 ms 291.5 qps 68 ms search.m2.xlarge 20 8 hosts 40 threads 419.6 qps 94 ms 665.9 qps 59 ms search.m2.2xlarge 20 16 hosts 80 threads 566.4 qps 140 ms 985.3 qps 80 ms
  • 34. 30 qps20 qps10 qps5 qps60 qps Index Partition 1 Replica 3 SEARCH m1.small Exemplo ??? ? ? ? ? ??? ? ? ? ? ??? ? ? ? ? ??? ? ? ? ???? ? ? ? ? ??? ? ? ? ? SEARCH.m1.small Index Partition 1 Replica 1 SEARCH.m1.small Index Partition 1 Replica 2 SEARCH m1.small Index Partition 1 Replica 1 SEARCH m1.small Index Partition 1 Replica 2 SEARCH m1.small Index Partition 1 Replica 1 ?? ? 40 qps50 qps
  • 36. Consultas Simples {"status": { "rid": "i8TQupgpEQocRhU=","time-ms": 3}, "hits": {"found": 9234, "start": 0, "hit": [ { "id": "523254764427952129", "fields": { "text": "idk if its yummy or what lol im hungry" } },... http://<endpoint>/2013-01-01/search?q=idk
  • 37. Consultas Estruturadas {"status": { "rid": "lPfcupgpFAocRhU=","time-ms": 4}, "hits": {"found": 6235, "start": 0, "hit": [ { "id": "523260481096540160", "fields": { "text": "idk what it is but ... something's different" } },... http://<endpoint>/2013-01-01/search?q=(and 'idk' country:'United States')&q.parser=structured
  • 38. Outras Opções de Consulta {"status": { "rid": "9MPvupgpFwocRhU=","time-ms": 2}, "hits": {"found": 8997, "start": 0, "hit": [ { "id": "523303605575909376", "fields": { "text": "Idk ... Idk idk idk idk idk idk" } },... http://<endpoint>/2013-01-01/search?q=idk &q.parser=structured&q.options={fields:['text^4','us er_description^0.5']}
  • 39. Filtro Geográfico {"status": { "rid": "+r6Wh5gpBgocRhU=","time-ms": 2}, "hits": {"found": 78, "start": 0, "hit": [ { "id": "523341488005345280", "fields": { "text": "I love talking baseball with my dad" } },... fq=geo:['37.8324,-122.3553','37.6040,-123.0137']& q='baseball'&q.parser=structured&return=text
  • 40. Dica #6 Utilize o parâmetro de filtragem (fq) sempre que possível
  • 41. Filtro versus Consulta • Filtros não contribuem para o ranqueamento • Filtros podem ser mais rápidos • Filtros suportam linguagem estruturada de consulta Times include HTTP transport 0 50 100 150 200 250 q= fq= fq= (10 Queries) TotalQueryLatency,Milliseconds Query Condi on p50 Average p90
  • 42. Ordenação Geográfica {"status": { "rid": "+vtjHjJgpDwocRhU=","time-ms": 41}, "hits": {"found": 78, "start": 0, "hit": [ { "id": "523310760416378881", "fields": { "text": "Still can't believe it! What a game! @sfgiants #worldseries @ AT&amp;T Park http://t.co/TTNP7CPHHP" } },... expr.dist=haversin(37.7786,- 122.3892,geo.latitude,geo.longitude)&sort=dist asc& q='baseball'&q.parser=structured&return=text
  • 43. Boosting baseball (or 'baseball' (term field='hashtags' boost=4 'sfgiants')) • Great Day of Baseball here at the Junior Fall Classic • Good Morning! Fall #Baseball. #HuntingtonPark • Beautiful Saturday morning for baseball in Norfolk. • A day off. Pretty nice to have one sometimes. No teaching, no #baseball • One word to describe 9th inning....baseball. #SFGiants • I'm on a #SFGiants high. Listening to analysis... • @RealTimers @thejoelstein Unless it's #SFGiants... • Apropos of nothing: #SFGiants are in the Big Show again...
  • 46. Dica #7 Use o AWS SDK ou CLI para consultar o CloudSearch
  • 47. Usando o AWS SDK AmazonCloudSearchDomainClient client = new AmazonCloudSearchDomainClient( new ProfileCredentialsProvider("user_profile”)); client.setEndpoint(endpoint); SearchRequest search = new SearchRequest(); search.setQuery(query); SearchResult results = client.search(search);
  • 48. Usando a AWS CLI {"status": { "rid": "wdzc35cpBgoupzc=","time-ms": 4}, "hits": {"found": 20622, "start": 0, "hit": [ { "id": "523897644771733504", "fields": { "text": "idk if its yummy or what lol im hungry" } },... $ aws cloudsearchdomain search --search-query 'idk' --endpoint 'http://<endpoint>/'
  • 50. Dica #8 Use Cache para Melhorar a Performance e Diminuir os Custos
  • 52. Dica #9 Crie arquiteturas multi-tenancy (para “múltiplos vizinhos”)
  • 53. Dados Heterogêneos Cliente 1 Cliente 2 Cliente 3 Idioma 1 Idioma 2 Idioma 3 Tipo 1 Tipo 2 Tipo 3
  • 54. Solução 1 – Domínio Único ..."customer_id":"12d4efd56"... fq=customer_id:'12d4efd56'
  • 55. Solução 2 – Múltiplos Domínios http://endpoint1, http://endpoint2, http://endpoint3
  • 56. Melhores Práticas • Escolha a abordagem de domínio único quando o número de vizinhos for grande • Escolha a abordagem de múltiplos domínios quando existe grande variação de escala ou configuração entre os vizinhos • Escolha uma abordagem híbrida (quando fizer sentido) para minimizar o custo e maximizar a performance
  • 57. Dica #10 Minere comportamento do usuário para aprimorar os resultados da busca
  • 58. Monitoramento do Comportamento de Usuário Servidores de Aplicação Amazon Redshift Informaçòes de Sessão Consultas/Resultados Cliques Compras Amazon CooudSearch Amazon EMR Banco da Aplicação Processamento
  • 59. O Que é Possível Fazer com Comportamento de Usuário? • Boosting de documentos • Enriquecimento de documentos • Criação de sinônimos • Etc…
  • 60.
  • 61. • Multinacional Brasileira • 5 anos, Pioneira e Líder de Mercado • Certificada pelo Facebook e pelo Twitter • Parceira do Google+, Facebook e Twitter • Presente em 40 das 100 Maiores Empresas do Brasil* “Queremos focar nas funcionalidades desejadas pelos clientes” David Lojudice, CTO do Scup Fonte: Revista Exame
  • 62. • “Near real-time search”: busca em documentos recém- indexados • Mínimo esforço do time de DevOps. • Volume crescente de buscas • Volume crescente de indexação O Desafio
  • 63. • Solução Inicial (primeiro ano da empresa) • Problemas: – Performance – Não permitia filtros complexos – Não escala 1a. Geração – MySQL Full Text Search Amazon EC2 Crawlers
  • 64. • Entendemos que precisávamos de um search engine (segundo ano da empresa) • Problemas: – Não escala – Instabilidade (índice corrompia) – Demandava tempo significativo da equipe de DevOps 2a. Geração - Sphinx Amazon EC2 Crawlers
  • 65. • “Near real-time search” • Escala (volume, buscas e indexação) • Baixa demanda do time de DevOps. 3a. Geração - CloudSeach Amazon RDS MySQL Amazon EC2 Crawlers Amazon CloudSearch
  • 66. • 300 milhões de documentos • 400 mil queries / dia • 300 mil indexações / dia • 17 instâncias search.m2.2xlarge CloudSearch no Scup
  • 67. • Migre para a API 2013 • Mais barato, melhor integração – AWS SDK, AWS CLI • Use o máximo que puder de batches para obter a melhor performance durante indexações • Escale manualmente quando for carregar dados de forma massiva e em picos de consulta • Features do Solr possibilitam queries mais avançadas • Crie domínios “multi-tenant”, use filtros, diferentes idiomas, etc. Resumo
  • 68. Leitura • aws.amazon.com/documentation/cloudsearch/ Comunidade e suporte: • awshub.com.br • forums.aws.amazon.com • aws.amazon.com/support Treinamento • qwiklabs.com/focuses/preview/1269 Próximos Passos
  • 69. Fábio Aragão da Silva, Solutions Architect – AWS