DEV Community

Lucas Cândido Araújo
Lucas Cândido Araújo

Posted on

Configuração de API para Envio de SMS via AWS

Este documento contém instruções para configurar um sistema de envio de SMS usando serviços AWS (API Gateway, Lambda e SNS).

Índice

  1. Arquitetura da Solução
  2. Código da Função Lambda
  3. Configuração da Infraestrutura
  4. Configuração de Autenticação com API Key
  5. Como Usar a API
  6. Considerações Adicionais

Arquitetura da Solução

A solução consiste em:

  • API Gateway: Recebe requisições HTTP POST
  • Lambda: Processa as requisições e chama o SNS
  • SNS: Envia as mensagens SMS para os destinatários

O fluxo de dados é:

  1. Cliente envia POST para o API Gateway
  2. API Gateway aciona a função Lambda
  3. Lambda extrai os dados e chama o SNS
  4. SNS envia o SMS para o número especificado

Código da Função Lambda

Arquivo: send_sms_lambda.py

import json
import boto3
import os

def lambda_handler(event, context):
    try:
        # Extrair o corpo da requisição
        if 'body' in event:
            # Se o corpo vier como string (do API Gateway), converter para dict
            if isinstance(event['body'], str):
                body = json.loads(event['body'])
            else:
                body = event['body']
        else:
            body = event

        # Extrair número e conteúdo
        phone_number = body.get('numero')
        message_content = body.get('conteudo')

        # Validar os dados
        if not phone_number or not message_content:
            return {
                'statusCode': 400,
                'body': json.dumps({
                    'message': 'Parâmetros obrigatórios: numero e conteudo'
                })
            }

        # Inicializar cliente SNS
        sns_client = boto3.client('sns')

        # Enviar SMS
        response = sns_client.publish(
            PhoneNumber=phone_number,
            Message=message_content
        )

        # Retornar resposta de sucesso
        return {
            'statusCode': 200,
            'body': json.dumps({
                'message': 'SMS enviado com sucesso',
                'messageId': response['MessageId']
            })
        }

    except Exception as e:
        # Tratar erros
        return {
            'statusCode': 500,
            'body': json.dumps({
                'message': f'Erro ao enviar SMS: {str(e)}'
            })
        }
Enter fullscreen mode Exit fullscreen mode

Configuração da Infraestrutura

Criar a função Lambda

# Primeiro, compacte o código da função
zip send_sms_function.zip send_sms_lambda.py

# Crie um perfil de execução para a Lambda com permissões para SNS
aws iam create-role \
  --role-name send-sms-lambda-role \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }'

# Anexe a política para permitir que a Lambda envie SMS via SNS
aws iam attach-role-policy \
  --role-name send-sms-lambda-role \
  --policy-arn arn:aws:iam::aws:policy/AmazonSNSFullAccess

# Aguarde alguns segundos para a propagação do perfil
sleep 10

# Crie a função Lambda
aws lambda create-function \
  --function-name SendSMSFunction \
  --zip-file fileb://send_sms_function.zip \
  --handler send_sms_lambda.lambda_handler \
  --runtime python3.9 \
  --role $(aws iam get-role --role-name send-sms-lambda-role --query 'Role.Arn' --output text)
Enter fullscreen mode Exit fullscreen mode

Criar o API Gateway

# Criar o API Gateway REST API
aws apigateway create-rest-api \
  --name "SMS-API" \
  --description "API para envio de SMS via SNS"

# Obter o ID do API Gateway criado
API_ID=$(aws apigateway get-rest-apis --query "items[?name=='SMS-API'].id" --output text)

# Obter o ID do recurso raiz
ROOT_RESOURCE_ID=$(aws apigateway get-resources --rest-api-id $API_ID --query "items[?path=='/'].id" --output text)

# Criar um recurso para o endpoint de SMS
aws apigateway create-resource \
  --rest-api-id $API_ID \
  --parent-id $ROOT_RESOURCE_ID \
  --path-part "send-sms"

# Obter o ID do recurso criado
RESOURCE_ID=$(aws apigateway get-resources --rest-api-id $API_ID --query "items[?path=='/send-sms'].id" --output text)

# Criar o método POST
aws apigateway put-method \
  --rest-api-id $API_ID \
  --resource-id $RESOURCE_ID \
  --http-method POST \
  --authorization-type NONE

# Obter o ARN da função Lambda
LAMBDA_ARN=$(aws lambda get-function --function-name SendSMSFunction --query 'Configuration.FunctionArn' --output text)

# Integrar o método POST com a função Lambda
aws apigateway put-integration \
  --rest-api-id $API_ID \
  --resource-id $RESOURCE_ID \
  --http-method POST \
  --type AWS_PROXY \
  --integration-http-method POST \
  --uri arn:aws:apigateway:$(aws configure get region):lambda:path/2015-03-31/functions/$LAMBDA_ARN/invocations

# Dar permissão para o API Gateway invocar a função Lambda
aws lambda add-permission \
  --function-name SendSMSFunction \
  --statement-id apigateway-test \
  --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn "arn:aws:execute-api:$(aws configure get region):$(aws sts get-caller-identity --query 'Account' --output text):$API_ID/*/POST/send-sms"

# Implantar a API
aws apigateway create-deployment \
  --rest-api-id $API_ID \
  --stage-name prod
Enter fullscreen mode Exit fullscreen mode

Configuração de Autenticação com API Key

# 1. Criar uma API Key
aws apigateway create-api-key \
  --name "SMSAPIKey" \
  --description "API Key para o serviço de SMS" \
  --enabled

# Guardar o ID da API Key
API_KEY_ID=$(aws apigateway get-api-keys --query "items[?name=='SMSAPIKey'].id" --output text)

# 2. Criar um plano de uso
aws apigateway create-usage-plan \
  --name "SMSUsagePlan" \
  --description "Plano de uso para o serviço de SMS" \
  --throttle burstLimit=10,rateLimit=5 \
  --quota limit=100,offset=0,period=DAY \
  --api-stages apiId=$API_ID,stage=prod

# Guardar o ID do plano de uso
USAGE_PLAN_ID=$(aws apigateway get-usage-plans --query "items[?name=='SMSUsagePlan'].id" --output text)

# 3. Associar a API Key ao plano de uso
aws apigateway create-usage-plan-key \
  --usage-plan-id $USAGE_PLAN_ID \
  --key-id $API_KEY_ID \
  --key-type "API_KEY"

# 4. Atualizar o método para exigir API Key
aws apigateway update-method \
  --rest-api-id $API_ID \
  --resource-id $RESOURCE_ID \
  --http-method POST \
  --patch-operations op=replace,path=/apiKeyRequired,value=true

# 5. Reimplantar a API para aplicar as alterações
aws apigateway create-deployment \
  --rest-api-id $API_ID \
  --stage-name prod

# Obter o valor da API Key
aws apigateway get-api-key \
  --api-key $API_KEY_ID \
  --include-value
Enter fullscreen mode Exit fullscreen mode

Como Usar a API

Após a implantação, você terá um endpoint com o seguinte formato:

https://{API_ID}.execute-api.{region}.amazonaws.com/prod/send-sms
Enter fullscreen mode Exit fullscreen mode

Para enviar um SMS, faça uma requisição POST para este endpoint com o seguinte corpo JSON:

{
  "numero": "+5511999999999",
  "conteudo": "Segue abaixo o código de autenticação: 000000"
}
Enter fullscreen mode Exit fullscreen mode

Exemplo de como fazer isso com curl:

curl -X POST \
  https://{API_ID}.execute-api.{region}.amazonaws.com/prod/send-sms \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: sua-api-key-aqui' \
  -d '{
    "numero": "+5511999999999",
    "conteudo": "Segue abaixo o código de autenticação: 000000"
  }'
Enter fullscreen mode Exit fullscreen mode

Considerações Adicionais

  1. Segurança:

    • A API Key deve ser mantida em segredo
    • Considere implementar autenticação mais robusta para ambientes de produção
    • Todas as comunicações devem ser feitas via HTTPS
  2. Monitoramento:

    • Configure CloudWatch para monitorar as chamadas à API e à função Lambda
    • Crie alarmes para notificar sobre falhas ou uso excessivo
  3. Limites de SMS:

    • Verifique os limites de envio de SMS na sua conta AWS
    • Solicite aumento de limites se necessário
    • Por padrão, novas contas AWS estão no modo sandbox para SMS
  4. Custos:

    • O preço do envio de SMS varia por país
    • Consulte a página de preços do SNS para mais detalhes
    • Configure orçamentos e alertas de custo
  5. Conformidade:

    • Certifique-se de cumprir as regulamentações locais para envio de SMS
    • Obtenha consentimento dos destinatários antes de enviar mensagens

Top comments (0)