Tutorial: como consultar dados do Amazon S3
Este tutorial orienta você na configuração do recurso de analytics do zero e na execução da primeira consulta de analytics em dados Parquet no Amazon S3. Ao final, o cluster de banco de dados do Aurora PostgreSQL estará consultando dados do Amazon S3 por meio de SQL padrão.
Tópicos
Pré-requisitos
Antes de começar, você deve ter o seguinte:
-
Uma conta da AWS com permissões para criar perfis do IAM, clusters do Amazon RDS e endpoints da VPC.
-
A AWS CLI instalada e configurada.
-
Uma VPC com pelo menos duas sub-redes em diferentes zonas de disponibilidade, um grupo de sub-redes de banco de dados e um grupo de segurança para o Aurora.
-
Arquivos de dados Parquet em um bucket do Amazon S3. Se você ainda não tiver dados, poderá carregar um arquivo de exemplo (este tutorial usa um conjunto de dados de pedidos como exemplo).
Etapa 1: criar uma política e um perfil do IAM
Crie uma política do IAM que conceda à extensão acesso de leitura ao bucket do Amazon S3 e, em seguida, crie um perfil e associe a política a ele.
Como criar a política do IAM:
aws iam create-policy \ --policy-name AuroraAnalyticsReadAccess \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetObject", "s3:GetBucketLocation"], "Resource": ["arn:aws:s3:::your-data-bucket", "arn:aws:s3:::your-data-bucket/*"] } ] }'
Como criar o perfil do IAM e associar a política a ele:
aws iam create-role \ --role-name AuroraAnalyticsRole \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "rds.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }' aws iam attach-role-policy \ --role-name AuroraAnalyticsRole \ --policy-arn arn:aws:iam::<account-id>:policy/AuroraAnalyticsReadAccess
Etapa 2: criar o cluster de banco de dados do Aurora PostgreSQL
Crie um grupo de parâmetros do cluster de banco de dados e, em seguida, crie o cluster e uma instância de banco de dados.
Para criar o grupo de parâmetros com o recurso habilitado:
aws rds create-db-cluster-parameter-group \ --db-cluster-parameter-group-name my-analytics-params \ --db-parameter-group-family aurora-postgresql17 \ --description "Parameter group with aurora_analytics enabled" aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name my-analytics-params \ --parameters "ParameterName=aurora_analytics.enabled,ParameterValue=true,ApplyMethod=immediate"
Para criar o cluster de banco de dados:
aws rds create-db-cluster \ --db-cluster-identifier my-analytics-cluster \ --engine aurora-postgresql \ --engine-version 17.11 \ --master-username postgres \ --master-user-password <password> \ --db-cluster-parameter-group-name my-analytics-params \ --db-subnet-group-name <subnet-group> \ --vpc-security-group-ids <security-group-id>
Para criar uma instância de banco de dados:
aws rds create-db-instance \ --db-instance-identifier my-analytics-instance-1 \ --db-cluster-identifier my-analytics-cluster \ --db-instance-class db.r8gd.xlarge \ --engine aurora-postgresql
Aguarde até que a instância de banco de dados fique disponível.
aws rds wait db-instance-available \ --db-instance-identifier my-analytics-instance-1
Etapa 3: associar o perfil do IAM ao cluster de banco de dados
aws rds add-role-to-db-cluster \ --db-cluster-identifier my-analytics-cluster \ --role-arn arn:aws:iam::<account-id>:role/AuroraAnalyticsRole \ --feature-name AuroraAnalytics
Etapa 4: configurar o endpoint da VPC de gateway do Amazon S3
Se o cluster de banco de dados do Aurora estiver em uma sub-rede privada, crie um endpoint de gateway do Amazon S3:
aws ec2 create-vpc-endpoint \ --vpc-id <vpc-id> \ --service-name com.amazonaws.<region>.s3 \ --route-table-ids <route-table-id>
Etapa 5: conectar-se e instalar a extensão
Conecte-se ao cluster de banco de dados do Aurora PostgreSQL usando psql:
psql --host=my-analytics-cluster.<region>.rds.amazonaws.com \ --port=5432 --username=postgres --password
Instale a extensão aurora_analytics:
CREATE EXTENSION aurora_analytics;
Verifique a instalação:
SELECT extname, extversion FROM pg_extension WHERE extname = 'aurora_analytics';
Saída esperada:
extname | extversion ------------------+------------ aurora_analytics | 1.0
Verifique se o servidor estrangeiro foi criado:
SELECT srvname FROM pg_foreign_server WHERE srvname = 'aurora_analytics_server';
Etapa 6: criar uma tabela estrangeira
Crie uma tabela estrangeira que aponte para os dados Parquet no Amazon S3. O uso de parênteses vazios () permite que o Aurora PostgreSQL infira automaticamente o esquema com base nos metadados Parquet.
CREATE FOREIGN TABLE ft_orders () SERVER aurora_analytics_server OPTIONS ( location 's3://your-data-bucket/data/orders/', format 'parquet', region 'us-east-1' );
Verifique o esquema inferido:
\d ft_orders
Etapa 7: executar a primeira consulta
-- Count all rows SELECT COUNT(*) FROM ft_orders; -- Aggregation with filter SELECT status, COUNT(*) AS order_count, SUM(total_amount) AS total_revenue, AVG(total_amount) AS avg_order_value FROM ft_orders WHERE order_date >= '2024-01-01' GROUP BY status ORDER BY total_revenue DESC;
Etapa 8: fazer uma junção com uma tabela local do PostgreSQL
Crie uma tabela local e faça uma junção com a tabela estrangeira:
-- Create a local dimension table CREATE TABLE customer_segments ( customer_id BIGINT PRIMARY KEY, segment TEXT, region TEXT ); INSERT INTO customer_segments VALUES (1, 'VIP', 'US-West'), (2, 'Premium', 'US-East'), (3, 'Regular', 'EU-West'); -- Join local table with S3 data SELECT cs.segment, cs.region, COUNT(*) AS order_count, SUM(o.total_amount) AS total_revenue FROM ft_orders o JOIN customer_segments cs ON o.customer_id = cs.customer_id WHERE o.order_date >= '2024-01-01' GROUP BY cs.segment, cs.region ORDER BY total_revenue DESC;
Etapa 9: materializar os resultados no PostgreSQL
Armazene os resultados de consultas do Amazon S3 em uma tabela local do PostgreSQL para agilizar os acessos repetidos:
CREATE TABLE monthly_revenue AS SELECT DATE_TRUNC('month', order_date) AS month, COUNT(*) AS order_count, SUM(total_amount) AS total_revenue, AVG(total_amount) AS avg_order_value FROM ft_orders WHERE order_date >= '2024-01-01' GROUP BY DATE_TRUNC('month', order_date) ORDER BY month; -- Query the materialized result (fast, local PostgreSQL) SELECT * FROM monthly_revenue;
Etapa 10: verificar o cache e o desempenho
Após executar as consultas, verifique se o cache está funcionando:
-- Check cache size (should be non-zero after queries) SELECT pg_size_pretty(aurora_analytics_cache_size()) AS cache_size; -- Check per-query statistics SELECT query, pg_size_pretty(analytics_cache_hit_bytes) AS cache_hits, pg_size_pretty(analytics_remote_read_bytes) AS s3_reads FROM aurora_analytics_stat_statements() WHERE analytics_cache_hit_bytes > 0 OR analytics_remote_read_bytes > 0;
Execute a mesma consulta novamente e observe a melhora: na segunda execução, os dados são lidos do cache, em vez de serem obtidos do Amazon S3.
Fazer a limpeza.
Para evitar cobranças contínuas, exclua os recursos que você criou:
-- Drop the foreign table DROP FOREIGN TABLE ft_orders; DROP TABLE customer_segments; DROP TABLE monthly_revenue;
aws rds delete-db-instance --db-instance-identifier my-analytics-instance-1 --skip-final-snapshot aws rds delete-db-cluster --db-cluster-identifier my-analytics-cluster --skip-final-snapshot aws iam detach-role-policy --role-name AuroraAnalyticsRole --policy-arn arn:aws:iam::<account-id>:policy/AuroraAnalyticsReadAccess aws iam delete-role --role-name AuroraAnalyticsRole aws iam delete-policy --policy-arn arn:aws:iam::<account-id>:policy/AuroraAnalyticsReadAccess
Próximas etapas
Agora que concluiu o tutorial, examine os seguintes tópicos:
-
Trabalhar com tabelas estrangeiras: saiba mais sobre tabelas do Iceberg, viagem no tempo com snapshot e carimbo de data/hora e gerenciamento de esquemas.
-
Parâmetros de configuração: ajuste
query_mempara a workload. -
Práticas recomendadas: otimize a organização dos dados, o dimensionamento da instância e a simultaneidade.
-
Monitoramento e solução de problemas: métricas, eventos de espera e diagnóstico de problemas.