Post on 16-Apr-2017
© 2016, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Construyendo APIs Seguras y Escalables
Demostración usando Amazon API Gateway y AWS Lambda
Mauricio MuñozEnterprise Solutions Architect, LATAM
Abril, 2016
¿Qué vamos a ver en esta sesión?
1. Nuevo modelo de desarrollo: Completamente gerenciado
2. Declarar APIs con Amazon API Gateway3. Lógica de la aplicación en AWS Lambda4. APIs de Login y Registro, utilizando Amazon Cognito5. Autorización utilizando AWS IAM (STS)6. Generación de SDK para cliente
Totalmente Gerenciado
API: Modelo Totalmente gerenciado
InternetMobile appsFunciones
AWS Lambda
AWS
API Gateway cache
Endpoints en Amazon EC2
Cualquier otro endpoint público
Amazon CloudWatch
Amazon CloudFront
API Gateway
API Gateway
Otros Servicios
AWS
FuncionesAWS Lambda
Puntos Principales
AWS Lambda + Amazon API Gateway =
0 (cero) infraestructura para administrar
Seguridad = Prioridad:
Aproveche la integración con AWS Identity and Access Management
Swagger + client SDK = Automatización de workflows
Servicios que vamos a utilizar
Amazon API Gateway AWS Lambda Amazon Cognito Amazon DynamoDB
Publica las APIs y enruta las llamadas
Ejecuta: Lógica de autenticación y lógica
de la aplicación
Gerencia de identidades y entrega
credenciales AWS
Almacén de datos:Usuarios y Mascotas
Arquitectura de la aplicación:Mascotas
No-Autenticadas
Flujo de las llamadas
Mobile apps AWS Lambda lambdaHandler
Register (/user-POST)
Login (/login-POST)API Gateway
Autenticadas
Mobile apps AWS Lambda lambdaHandler
ListPets (/pets – GET)
GetPet (/pets/{petId}-GET
API Gateway
Assume Role
CreatePet (/pets – POST)
Sigv4Usando las
credenciales AWSInvoca con las
credenciales AWS Autorizado por IAM
Recibe credenciales AWS
APIs:/user/login
APIs:/pets
/pets/{petId}
Table: petstoreapp-users
IdentityPool: PetStoreApp
Table: petstoreapp-pets
¿Qué tiene de diferente este modelo?
“Serverless” – La aplicación puede usar muchos servidores, pero no necesito administrar ninguno.
Autorización: Realizada por AWS, basada en Roles
Definición e implementación de APIs usando Swagger
Parte I: APIs – Definición y Publicación
Amazon API Gateway - Conceptos
Gerenciamiento de implementaciones – múltiples versiones y ambientes (stages)
Definición y Publicación de APIs
Usa las credenciales de AWS IAM para el control de
acceso a sus recursos (Como si fueran servicios
AWS)
Aprovecha los mecanismos de Autorización de AWS
Gestión de tráfico de red
Protección DDoS y “Throttling”
Modelo de API: Recursos, Métodos e Integraciónrest-api-id
resource-id
ARN
Recursos y Métodos• POST – Recibe usuario y
contraseña; registra (crea) el nuevo usuario en DynamoDB
/users
• POST – Recibe usuario y contraseña; autentica; solicita credenciales AWS a cognito y las retorna a la App
/login
• POST – Recibe los datos de la mascota;los guarda en DynamoDB
• GET – Retorna una lista de mascotas desde DynamoDB
/pets
• GET – Retorna la información de la mascota, a partir de su petID/pets/{petId}
No Autenticado
Autenticado
rest-api-idresource-id
ARN
Usando Swagger para automatizar el proceso
Method Response
Integration (Req. & Resp)
Method Request
Method
Usando Swagger para automatizar el proceso
/users: post: summary: Registers a new user consumes: - application/json produces: - application/json parameters: - name: NewUser in: body schema: $ref: '#/definitions/User’ x-amazon-apigateway-integration: type: aws uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31... credentials: arn:aws:iam::964405213927:role/pet_store_lambda_invoke ... responses: 200: schema: $ref: '#/definitions/RegisterUserResponse'
Usando Swagger para automatizar el proceso
Usando AWS CLIaws apigateway import-rest-api --body file://swagger.yaml
Usando la Consola
Beneficios de usar Swagger
• Las definiciones de las API permanecen en su repositorio, con el resto del código de la aplicación.
• Pueden ser usadas en conjunto con otras utilidades de Swagger (por ejemplo, generación de documentación).
• Las APIs pueden ser importadas e implementadas en su propio script.
Parte II: Ejecución de la lógica de la aplicación (Back-End)
Escalabilidad y Alto desempeño; Eficiente y Económica
No hay infraestructura para administrar
Pague solo por lo que use: Lambda adecúa automáticamente la
capacidad para responder a los volúmenes de solicitudes.
Use su propio código
Funciones Lambda : Ejecución de código basada en eventos, Stateless
Ejecute su código en una variedad de lenguajes estándar. Use threads,
procesos, archivos y shell scripts, de la forma usual.
Enfóquese en su lógica de negocio. Cargue su código y AWS Lambda se
encarga del resto.
AWS Lambda - Conceptos
Lambda handler.
lambdaHandler (en el código
Java)
Acción: Register
Acción: Login
Acción:Create Pet
Acción:Get Pet
Gestión de identidades
Pet store database
Amazon API Gateway
Integration request
Userdatabase
Excepciones mapeadas a HTTP Status.Register action
Login action
Create Pet action
Get Pet action
BadRequestExceptionBAD_REQUEST +
Stack Trace
InternalErrorExceptionINTERNAL_ERROR +
Stack TracelambdaHandler (en el código
Java)
Amazon API Gateway
responses: "default": statusCode: "200" "BAD.*": statusCode: "400" "INT.*": statusCode: "500"
Mapping Template es una herramienta poderosa
Encuentre más acerca de nuestros ”mapping templates”:
http://amzn.to/1L1hSF5
Parte III: Gerenciando identidades y autorizando accesos
Amazon Cognito - Conceptos
Gestión de usuarios autenticados e invitados,
entre diferentes proveedores de identidad
Gestión de Identidad
Sincroniza datos de los usuarios entre dispositivos
y plataformas, via nube
Sincronización de datos
Facilita el acceso seguro a servicios AWS desde
plataformas y dispositivos móviles
Acceso seguro a recursos AWS
Definición de las APIs (No Autenticadas)• POST
• Recibe un usuario y contraseña• Encripta la contraseña (con salt) y registra la
cuenta del usuario en DynamoDB• Hace una llamada a Cognito, para registrar
el usuario y generar las credenciales• Retorna las informaciones de usuario y
credenciales temporales
/users
• POST• Recibe un usuario y contraseña• Autentica el usuario (contra la información
en DynamoDB)• Si la autenticación es exitosa, hace una
llamada a Cognito para generar credenciales• Retorna las credenciales temporales
/login
Recibiendo las credenciales temporales.
Llamada a la API login
(sin autenticación)
Cliente API Gateway
Backend
/login Login action
BD Usuarios
Credenciales OK Solicita OIDC
Obtiene el token OpenID
Recibe las credenciales
AWS para firmar las llamadas API
Usando el token OIDC, solicita
credenciales AWSGenera las
credenciales AWS
Access key + secret key +
session token
/login
1.
2.
3.
Roles (AuthZ) en Cognito
Autorización de las llamadas API
APIs /pets (necesitan AuthN y AuthZ)• POST
• Recibe información de la mascota (nombre, tipo)
• Graba en DynamoDB• Retorna el petID creado
• GET• Retorna la lista de mascotas almacenada
en DynamoDB (incluyendo el petID)
/pets
• GET• Recibe (en el path) el petID• Usando mapping templates, se pasa el
parámetro petID a la función Lambda• Busca la información de la mascota en
DynamoDB• Retorna la información de la mascota
/pets/{petId}
API Gateway protege las llamadas APIrest-api-id
resource-id
ARN
API Gateway repasa las autorizaciones
credentials:
arn:aws:iam::*:user/*
En la consola En el archivo Swagger
El Rol IAM define la autorización{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Scan", "lambda:InvokeFunction", "execute-api:invoke" ], "Resource": [ "arn:aws:dynamodb:us-east-1:xxxxxx:table/test_pets", "arn:aws:lambda:us-east-1:xxxxx:function:PetStore”, "arn:aws:execute-api:us-east-1:xxxx:API_ID/*/POST/pets" ] } ]}
En este ejemplo, el rol permite accesos a:• DynamoDB• API Gateway• Lambda
Y permite definir acceso solamente a recursos específicos en esos servicios
Y todavía hay más: Fine-grained access permissions
InternetCliente
API Gateway
Funciones AWS Lambda
Amazon CloudFront
DynamoDB
CognitoId2
…"Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [”${cognito-identity.amazonaws.com:sub}"], "dynamodb:Attributes": [ "UserId","GameTitle","Wins","Losses", "TopScore","TopScoreDateTime” ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES” }}…
Ejecuta con el rol definido
UserID Wins Losses
cognitoId1 3 2
cognitoId2 5 8
cognitoId3 2 3
Informaciones de contexto (Cognito ID) son repasadas …
Con eso, AWS Lambda & DynamoDB seguirán coherentemente la política de acceso
Flujo autenticado completo
Mobile apps AWS Lambda lambdaHandlerAPI Gateway
Sigv4
Usa los mismos permisos de las credenciales de
usuario
Llamadas a los servicios son autorizadas
usando un rol IAM
Documentación acerca de FGAC:
http://amzn.to/1YkxcjR
DynamoDB
Beneficios de usar AWS IAM (AuthN & AuthZ)
• Separación de funciones – la estrategia de autorización se delega a un servicio dedicado
• Gestión centralizada de acceso, a través de un conjunto único de políticas
• Credenciales y Roles pueden ser modificadas o deshabilitadas con una llamada API
Parte IV: Manejo de credenciales AWS en el cliente
Generación de SDK desde la consola (1-click)
rest-api-id
El SDK de cliente declara todos los métodos
AWSCredentialsProvider.Implementación de AWSCredentialsProvider
El método refresh() es llamado cuando el cliente necesite nuevas credenciales
Beneficios del SDK generado
El SDK de cliente contiene la lógica para:
• Firmar las llamadas API usando sigv4
• Manejar respuestas reguladas (throttled)
• Marshal/unmarshal solicitudes y respuestas en objetos
AWS Lambda + Amazon API Gateway =
0 (cero) infraestructura para administrar
Seguridad = Prioridad:
Aproveche la integración con AWS Identity and Access Management
Swagger + client SDK = Automatización de workflows
¿Qué vimos hoy?
Este ejemplo está disponible en la cuenta GitHub AWSLabshttps://github.com/awslabs/api-gateway-secure-pet-store
¡Gracias !Este ejemplo está disponible en la cuenta GitHub AWSLabs
https://github.com/awslabs/api-gateway-secure-pet-store