Kaia  Schmitt

Kaia Schmitt

1660105260

Amazon API Gateway Sample: Cognito Credentials Through Lambda

Setup the Secure Pet Store

Introduction

The Secure Pet Store sample is an application built in Java for AWS Lambda. It uses Amazon API Gateway to expose the Lambda function as HTTP endpoints and uses Identity and Access Management (IAM) and Amazon Cognito to retrieve temporary credentials for a user and authorize access to its APIs with.

The Secure Pet Store

  • First, create an Amazon Cognito identity pool. The identity pool should only allow Custom authentication providers. Cognito Create Identity Pool Screenshot
  • The next step in the identity pool creation process sets up the IAM roles. For the time being simply click Allow to create the identity pool. Cognito Setup IAM Role Screenshot
  • Now that we have created the Cognito Identity Pool we need to setup the DynamoDB tables. The application requires 2 DynamoDB tables: one for the users and one for the pets. The annotated objects for users and pets are com.amazonaws.apigatewaydemo.model.pet.Pet and com.amazonaws.apigatewaydemo.model.user.User in the app source code.
  • The table for the users should have only a Hash Key of type string called username.
  • The pets table also has only a Hash Key of type string called petId.

Build and Deploy the Application to AWS Lambda

The application needs to be modified to reflect the resource names created above. After adapting the configuration you package the application and deploy it as an AWS Lambda function with the necessary execution role.

  • Configure the application to utilize the correct Cognito Identity Pool and DynamoDB tables. The app reads the configuration from static variables declared in the CognitoConfiguration and DynamoDBConfiguration in the com.amazonaws.apigatewaydemo.configuration package. Open the 2 classes and set the correct values on the properties.
ClassPropertyDescription
CognitoConfigurationIDENTITY_POOL_IDThe unique identifier for the Cognito Identity Pool. This values is available in the Amazon Cognito console.
CognitoConfigurationCUSTOM_PROVIDER_NAMEThe name of the developer provider specified during the Identity Pool creation process. You can access this value from the edit identity pool page.
DynamoDBConfigurationUSERS_TABLE_NAMEThe name of the DynamoDB table created to store usernames and passwords
DynamoDBConfigurationPET_TABLE_NAMEThe name of the DynamoDB table created to store the pets

Now that the application is configured you can build it and package it for AWS Lambda using Maven. Open a terminal and navigate to the application folder, then run mvn package. This will create a target directory and inside it a file called api-gateway-secure-pet-store-1.0-SNAPSHOT.jar.

We will create an AWS Lambda function that needs access to the resources created above. Create a new role in AWS Identity and Access Management with the following policies:

Trust Policy for the AWS Lambda execution role:

```json

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }


   Policy for the AWS Lambda execution role:

   ```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cognito-identity:GetOpenIdTokenForDeveloperIdentity"
            ],
            "Resource": [
                "<COGNITO_IDENTITY_POOL_ARN>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "<DYNAMODB_PETS_TABLE_ARN>",
                "<DYNAMODB_USERS_TABLE_ARN>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

Open the AWS Lambda console and create a new function. Skip the blueprint selection page and go straight to the Configure Function step. In this screen give your function a name and select Java 8 as runtime. AWS Lambda will ask you to upload a ZIP file for your function. You can upload the Jar file created by the maven process directly.

As a Handler for your function enter com.amazonaws.apigatewaydemo.RequestRouter::lambdaHandler.

Use the execution role created in the previous step. Lambda Create Function Screenshot

Now that the Lambda function is ready we can setup the API structure in Amazon API Gateway. To easily create the entire API we are going to use the Swagger format and import this into Amazon API Gateway.

Open the Swagger definition in the src/main/resources/Swagger.yaml file. Search the file for x-amazon-apigateway-integration. This tag defines the integration points between API Gateway and the backend, our Lambda function. Make sure that the uri for the Lambda function is correct, it should look like this:

arn:aws:apigateway:<YOUR REGION>:lambda:path/2015-03-31/functions/<YOUR LAMBDA FUNCTION ARN>/invocations

You can specify the role ARN in the credentials field of the Swagger file, next to the uri field. The /pets methods use a special role: arn:aws:iam::*:user/*. This tells API Gateway to invoke the Lambda function using the caller credentials. For the /users and /login (the first 2 paths in the file) you will also have to specify the invocation role API Gateway should use to call the Lambda function. You can create a new invocation role for the /users and /login methods from the Identity and Access Management (IAM) console with the following policies:

Trust Policy for the AWS Lambda invocation role:

```json

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }


   Policy for the AWS Lambda invocation role:

   ```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "<LAMBDA_ARN>"
            ]
        }
    ]
}

Copy the Role ARN from the Role Summary page, and paste it in the credentials field of the /users and /login methods of the Swagger file.

Now that we have generated all resources for our API and we have all the ARNs, we should also modify the access policy of the Cognito Identity Pool to grant access to the Amazon API Gateway for authenticated users.

In the IAM console navigate to the roles list and open the authenticated role of your Cognito Identity Pool - the role is likely to be called Cognito_"IdentityPoolName"Auth_Role

Change the policy to:

```json

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "execute-api:Invoke" ], "Resource": [ "*" ] } ] }


* Once you have modified and saved the Swagger file to call the correct Lambda function and use your roles [create a new API in Amazon API Gateway](https://console.aws.amazon.com/apigateway/home?region=us-east-1#/apis/create) with the **Import from Swagger** feature.
* You should now be able to deploy and test your **API Gateway Secure Pet Store** API with Amazon API Gateway

# Setting up the iOS sample

## Introduction
The iOS sample application is located under the ```/src/main/resources/ios_sample folder```. It uses [CocoaPods](https://cocoapods.org/) to retrieve its dependencies and includes an iOS client SDK generated with API Gateway.

## Step by Step setup
* If you don't have [CocoaPods](https://cocoapods.org/) installed, follow the installation instructions on the website
* The first step is to copy the contents of the `ios_sample` folder to a new project directory.
* Open a terminal and navigate to the new project directory `cd /your/project/dir`
* To install the dependencies using CocoaPods run `pod install` from the terminal in the project folder
* Open the new `.xcworkspace` file created by CocoaPods in the project folder using XCode
* From XCode open the `PetTest/ClientSDK/PETLambdaMicroserviceClient.m` file
* On line 117 change the `*URLString` definition to match the url of your API deployment with Amazon API Gateway

## The AWSCredentialsProvider
In order to provide credentials to our SDK, and make calls to the Secure Pet Store backend, we have created a custom implementation of the `AWSCredentialsProvider` object. The `AWSCredentialsProvider` interface declares a single method, `(AWSTask *)refresh`. This method is called by the generated SDK whenever it needs credentials and is in charge of fetching a new set of temporary AWS credentials from your backend and storing them in its `_accessKey`, `_secretKey`, and `session_key` properties.

Our custom implementation is located under `PetTest/APIGSessionCredentialsProvider`. The refresh method uses the generated client to call the `login` method with a cached username and password. The login method from our backend verifies the credentials and responds with a set of temporary AWS credentials.

Author: aws-samples
Source code: https://github.com/aws-samples/api-gateway-secure-pet-store
License: Apache-2.0 license

#amazon #aws #Lambda 

Amazon API Gateway Sample: Cognito Credentials Through Lambda
Anne  de Morel

Anne de Morel

1660050963

Passerelle d'API Amazon avec .NET

Dans cet article complet, nous allons apprendre Amazon API Gateway avec la pile .NET. Grâce à cela, nous pourrons exposer assez facilement AWS Lambdas au monde extérieur.

Dans un article précédent, nous avons appris à travailler avec AWS Lambda en utilisant .NET, qui est un point essentiel pour démarrer avec les applications sans serveur. Bien que nous ayons construit et déployé ces Lambda sur AWS, nous n'avons jamais vraiment discuté de la manière dont nous les exposerions à être invoquées par le monde extérieur.

Plus loin dans ce guide complet, nous allons créer une application sans serveur complète qui s'intègre de manière transparente entre Amazon API Gateway, Lambda, DynamoDb pour la persistance et Cloudwatch à des fins de journalisation.

Vous pouvez trouver le code source de l'implémentation ici .

Qu'est-ce qu'Amazon API Gateway ?

Amazon API Gateway est un service entièrement géré qui vous permet de créer des passerelles, qui servent essentiellement de porte dans votre monde de logique métier pour votre application. Avec ce service, vous exposez essentiellement les points de terminaison qui, lors de l'accès, se connectent à AWS Lambdas, aux points de terminaison publics et à divers autres services AWS en fonction de la manière dont vous créez Amazon API Gateway.

Supposons qu'une application exécutée sur Internet ait besoin d'accéder à la logique métier qui reste dans votre lambda. Ces applications clientes se connecteraient à Amazon API Gateway, qui redirigerait en interne la demande vers l'AWS Lambda associé ou d'autres services que vous auriez configurés.

Examinons une représentation schématique de ce à quoi ressemblerait un flux de requêtes commun via une passerelle API.

Passerelle d'API Amazon avec .NET

Comme vous pouvez le voir, les clients accèdent à la passerelle qui est connectée en interne à un service. Par exemple,

  • www.<url-of-aws-gateway>/test -> redirigerait vers un lambda nommé test-lambda
  • www.<url-of-aws-gateway>/get-students -> redirigerait vers un lambda qui renvoie la liste des étudiants
  • www.<url-of-aws-gateway>/weather?city=trivandrum -> redirigerait vers un point de terminaison d'API météo publique qui renverrait les données météorologiques de la ville de Trivandrum.

Aujourd'hui, les passerelles API sont souvent un élément essentiel de l'ensemble de l'écosystème AWS Serverless, car elles facilitent l'accès à nos services AWS à n'importe quelle échelle.

API REST AWS contre API HTTP

AWS prend en charge deux versions des services API Gateway. La version initiale était pour la variante API REST qui comprend des tonnes de fonctionnalités pour concevoir, développer et maintenir votre API Gateway. Plus tard, vers 2019, AWS introduit les API HTTP qui ont simplifié la création et le déploiement de la passerelle. Ne vous trompez pas avec le nommage, ces deux versions sont construites sur le protocole HTTP suivant les conventions REST. En interne, AWS les nomme v1 (API REST) ​​et v2 (API HTTP)

Il existe de nombreuses différences significatives entre ces versions, notamment les performances, les prix et l'expérience de développement. En bref, HTTP Apis gagne dans presque tous les départements et devrait être votre choix la plupart du temps.

  • Tout d'abord, les API HTTP sont censées être plus performantes et sont presque 10 à 15 % plus performantes que l'API REST.
  • En termes de tarification, pour les 300 premiers millions de requêtes par mois, les API HTTP ne vous coûteraient que 1 USD, alors que, pour le même volume, les API REST coûtent environ 3,5 USD. C'est une grande différence. Notez que l'offre gratuite d'AWS inclut 1 million d'API (REST et HTTP) par mois pendant les 12 premiers mois absolument gratuits. Assez de temps pour explorer ces deux technologies intéressantes, n'est-ce pas ?
  • L'expérience utilisateur offerte par la console AWS lors du développement de ces passerelles est complètement différente les unes des autres.
  • L'API REST prend en charge les points de terminaison optimisés pour la périphérie, ce qui garantit que vos points de terminaison sont largement répartis dans le monde, tandis que les points de terminaison HTTP ne prennent en charge que les déploiements régionaux, ce qui peut contribuer à un léger retard dans les réponses.
  • Ces deux éléments sont de nature hautement sécurisée.
  • Les déploiements Canary sont inclus avec l'API REST et non avec les API HTTP s'il s'agit d'un gros problème pour votre stratégie de déploiement.

Pour plus de comparaison, reportez-vous au guide du développeur d'AWS qui compare ces deux versions. Bien que les API HTTP soient moins chères que REST, il existe certainement de nombreuses fonctionnalités incluses dans l'API REST qui justifient la différence de prix.

Quant à notre démonstration, nous utiliserons des API HTTP. Peut-être que dans un article ultérieur, nous explorerons les API REST. Concept-sage, les deux sont presque les mêmes. Nous utiliserons la communauté Visual Studio 2022 avec l'extension AWS SDK Kit comme nous l'avons fait dans l'article précédent sur Lambda pour développer, tester, simuler et publier nos Lambdas sur le cloud AWS.

Il est important que vous ayez déjà parcouru l'article précédent sur AWS Lambda sur .NET, où nous avons configuré les identifiants AWS via l'interface de ligne de commande, installé l'AWS Toolkit sur Visual Studio Code. Si ce n'est pas le cas, reportez-vous à cet article de blog.

Création et publication d'un AWS Lambda avec .NET

Tout d'abord, ouvrons Visual Studio 2022 et créons une solution vierge. J'ai nommé ma solution AWSServerless.Dotnet.Demo . Fondamentalement, nous aurons 2 projets Lambda dans ce domaine, que nous ajouterons progressivement.

  1. Un Lambda factice qui renvoie un message Hello. Ce lambda sera utilisé pour présenter les bases de l'intégration d'Amazon API Gateway et d'autres éléments.
  2. Un étudiant Lambda, auquel nous ajouterons plusieurs gestionnaires de fonctions qui peuvent éventuellement effectuer certaines opérations CRUD de base sur DynamoDB. (PS, j'ai écrit un article sur Premiers pas avec DynamoDB à l'aide de .NET. Consultez-le également.)

Avant de continuer, assurez-vous que les éléments suivants sont déjà en place.

  • Configuration des informations d'identification AWS via l'AWS CLI.
  • AWS Toolkit installé sur votre installation Visual Studio.
  • Avoir un compte AWS. Un niveau gratuit serait plus que suffisant.

Vous pouvez obtenir plus d'informations sur les étapes ci-dessus dans mes articles précédents sur les applications sans serveur AWS avec .NET.

créer un projet vide aws passerelle Amazon API sans serveur avec .NET - Intégrations AWS Lambda et DynamoDB

Ajoutons notre premier projet Lambda à notre solution vierge. Cliquez avec le bouton droit sur la solution dans Visual Studio et cliquez sur Ajouter un nouveau projet. En supposant que vous avez déjà installé AWS Toolkit sur votre instance Visual Studio, vous pouvez rechercher AWS Lambda dans la fenêtre contextuelle « Ajouter un nouveau projet » qui s'affiche.

devenv iArkd7DjVv Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Cliquez sur Suivant. Ici, nommons le lambda HelloLambda. Comme mentionné précédemment, il s'agira d'un simple lambda qui nous aiderait à comprendre à quoi ressemblerait l'intégration complète avec Amazon API Gateway avec .NET. Lorsque vous êtes invité à sélectionner un plan pour votre nouveau lambda, sélectionnez "Fonction vide". Cela nous donne une table rase pour commencer à construire notre Lambda simple.

Vous connaissez déjà la structure des dossiers du projet AWS Lambda. Sinon, parcourez cet article. Ouvrez le Function.cs / FunctionHandler. Maintenant que nous allons attacher ce gestionnaire avec notre API Gateway, nous devons apporter quelques petites modifications à la signature de cette méthode. Mais avant cela, installons un package sur ce projet Lambda qui contient les contrats. Vous pouvez ouvrir la console du gestionnaire de packages et exécuter ce qui suit pour installer le package.

Install-Package Amazon.Lambda.APIGatewayEvents

Allons changer notre FunctionHandler maintenant.

public APIGatewayHttpApiV2ProxyResponse FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
request.QueryStringParameters.TryGetValue("name", out var name);
name = name ?? "John Doe";
var message = $"Hello {name}, from AWS Lambda";
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

APIGatewayHttpApiV2ProxyRequest représente la demande entrante d'une API HTTP. Si vous y réfléchissez, ou si vous regardez en arrière dans le premier diagramme de flux que nous avions, la demande que Lambda reçoit n'est pas directement du client, mais une demande d'Amazon API Gateway elle-même. Ainsi, dans ce cas, la passerelle API envoie une demande à Lambda avec le type APIGatewayHttpApiV2ProxyRequest . De même, APIGatewayHttpApiV2ProxyResponse est le type de réponse que Lambda renvoie à Amazon API Gateway. Vous pouvez également ignorer cette partie de réponse et renvoyer à la place des données cruciales comme exigence métier, comme une liste d'étudiants, ce que nous ferons pendant que nous construisons notre prochain Lambda plus loin dans ce guide.

Ce sont donc les principaux changements apportés à Lambda pour prendre en charge l'ensemble de l'intégration de la passerelle API. En dehors de cela, le gestionnaire de fonctions renvoie désormais un message indiquant « Bonjour {nom}, d'AWS Lambda ». Une autre chose ici est que, depuis Lambda, vous pouvez accéder au contexte entrant, qui comprend les chaînes de requête, les paramètres de chemin, les routes, etc. Pour ce Lambda, je m'attends à ce que la requête entrante ait un paramètre de requête de nom (…/hello?name=Mukesh), qui sera ensuite ajouté au message qu'il renvoie finalement.

Si le paramètre de requête n'existe pas, il continue avec le nom par défaut, qui est John Doe. Notez que nous renvoyons la réponse en tant que type APIGatewayHttpApiV2ProxyResponse, où Body est le message réel, et nous fournissons un code d'état de 200 SUCCESS.

C'est tout pour notre First Lambda. Publions-le sur AWS et testons-le localement dans Visual Studio. Faites un clic droit sur le projet HelloLambda et cliquez sur Publier sur AWS Lambda. Vous verrez la fenêtre contextuelle suivante.

image Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Les premiers détails sont remplis automatiquement par l'outil, étant donné que vous avez configuré vos informations d'identification AWS locales, votre région et votre profil.

  • Le nom de la fonction est le nom avec lequel Lambda sera identifié sur votre compte AWS.
  • Description - comme son nom l'indique.
  • Le gestionnaire est un peu important ici. Disons que votre Function.cs peut potentiellement avoir plusieurs méthodes Handler. Cette méthode Handler correspond à la fonction exacte vers laquelle votre Lambda doit pointer. Dans notre cas, il s'agit de HelloLambda::HelloLambda.Function::FunctionHandler. Gardez cela à l'esprit, car nous utiliserons ce champ plus tard dans notre article.

Cliquez sur Suivant.

devenv oEzQI2HY6h Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Dans l'écran suivant, le seul changement que vous aurez à faire est de sélectionner le bon rôle nécessaire. Dans notre cas, il s'agit du AWSLambdaBasicExecutionRole. Cela vient avec des autorisations pour écrire des journaux dans AWS Cloudwatch. C'est ça. Cliquez sur Télécharger. AWS commence à créer les rôles requis, exécute certaines commandes pour créer et publier votre Lambda localement, comprime les bibliothèques publiées et les télécharge sur AWS, ce qui crée finalement votre nouveau Lambda brillant.

Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Une fois cela fait, vous pouvez ouvrir AWS Management Console, accéder à Lambdas et vérifier que notre nouveau Lambda est créé.

image 2 Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

De retour à Visual Studio, vous pouvez voir que l'assistant de publication aurait ouvert un petit outil qui permet de tester notre Lambda directement depuis Visual Studio. Oh, et si vous ne le savez pas déjà, vous pouvez également exécuter simplement l'application Lambda en mode débogage, et Visual Studio lancera un outil Mock qui aide essentiellement à tester et déboguer votre code Lambda.

Pour l'instant, explorons l'outil intégré à l'interface de Visual Studio. Voici une capture d'écran ci-dessous.

image 1 Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Tout d'abord, cette interface vous permet d'envoyer des demandes fictives directement à votre Lambda qui a été déployé sur AWS. Cliquez sur le menu déroulant Example Request et sélectionnez API Gateway AWS Proxy. L'outil remplirait une demande d'échantillon. Ici, comme je l'ai fait, vous pouvez ajouter une clé/valeur de nom aux paramètres de chaîne de requête. Il y a pas mal de propriétés à tripoter ici. Une fois que vous avez cliqué sur Appeler, la réponse contiendrait notre message avec un code d'état de 200.

Maintenant, bien que Lambda soit prêt, nous n'avons vraiment aucun moyen d'accéder à cette fonction autrement qu'à partir des outils de débogage VS. Nous avons donc besoin d'un lien/point de terminaison auquel nous envoyons une demande, et nous attendons une demande similaire de Lambda. C'est là qu'Amazon API Gateway entre en scène.

Création d'Amazon API Gateway avec .NET

Commençons à concevoir notre première Amazon API Gateway. Recherchez API Gateway dans la barre de recherche que vous voyez dans AWS Management Console. Vous verrez la page d'accueil par défaut pour Amazon API Gateway. Ici, vous serez présenté avec des choix pour sélectionner un type d'API. Puisque nous allons utiliser l'API HTTP, cliquons sur le bouton Build qui lui est associé.

chrome HZudzLTStT Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Étant donné que notre Lambda est créée avec succès, vous pouvez sélectionner le type d'intégration comme Lambda et choisir notre fonction hello Lambda. Assurez-vous que nous nous en tenons à la version 2.0 de la charge utile car c'est la dernière. Assurez-vous également de sélectionner la bonne région AWS. Dans mon cas, c'est ap-sud-1. Cela fait, cliquez sur suivant.

chrome ZaswQgDPsT Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Vient ensuite une partie intéressante, où nous configurons les routes réelles qui peuvent invoquer notre hello Lambda. Vous pouvez voir que j'en ai fait une méthode GET qui aura un point de terminaison /hello et ciblera le Hello Lambda. Donc, fondamentalement, une fois que nous créons la passerelle API, AWS nous fournirait une URL de point de terminaison, à laquelle si nous ajoutons un /hello et envoyons une méthode GET avec les paramètres de requête appropriés, cela déclenchera Lambda et renverra la réponse prévue.

Notez que vous pouvez plusieurs routes et intégrations ici. Nous explorerons cela lorsque nous créerons notre passerelle API complète plus loin dans cet article.

chrome 1j5EYx3xWe Passerelle d'API Amazon avec .NET - Intégrations AWS Lambda et DynamoDB

Ensuite, l'assistant nous demandera de créer des étapes. Ce sera pratique si nous voulons déployer notre Amazon API Gateway à différentes étapes comme le développement, la production et la mise en scène. Mais pour l'instant, gardons-le comme valeur par défaut qui est `$default`, et cliquez sur Suivant.

Ici, vous pouvez revoir vos modifications et déployer votre passerelle. C'est tout, aussi simple que cela.

Dans l'écran ci-dessous, vous pouvez voir l'URL de l'Amazon API Gateway que nous venons de créer. Copiez ceci et ouvrez Postman ou tout autre outil de test d'API que vous utilisez. De plus, comme il ne s'agit que d'une méthode GET, vous êtes même libre d'utiliser le navigateur pour tester notre passerelle.

chrome kmkvkIZHmM Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Testons la réponse de notre passerelle API. Je vais utiliser Postman pour les tests. Assurez-vous qu'il s'agit d'une méthode GET, sinon la passerelle criera qu'un tel point de terminaison n'est pas trouvé.

Dans la capture d'écran ci-dessous, vous pouvez voir que j'ai envoyé une demande au point de terminaison /hello et que j'ai passé le nom du paramètre de requête en tant que mon nom, et vous pouvez également voir la réponse attendue de Lambda. Tout simple, non ? N'hésitez pas à jouer avec le Hello Lambda pour en savoir plus.

Postman 09XFb6JnKd Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Exploration de l'interface de la console Amazon API Gateway

Maintenant que nous avons créé notre première Amazon API Gateway avec AWS Lambdas alimenté par .NET, explorons l'interface et les fonctionnalités fournies sur Amazon API Gateway.

Sur la page d'accueil, vous pouvez voir une liste des passerelles que vous avez créées dans une région AWS spécifique.

chrome RYg52eeVpW Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Une fois que vous entrez dans une passerelle API spécifique, vous avez accès à un tas de fonctionnalités intéressantes pour peaufiner votre passerelle.

chrome C3lh3VJBk3 Passerelle d'API Amazon avec .NET - Intégrations AWS Lambda et DynamoDB

De là, vous arrivez à :

  • Ajoutez d'autres routes à une passerelle d'API Amazon existante.
  • Sécurisation d'Amazon API Gateway à l'aide de Lambdas et de JWT. Nous approfondirons cela dans le prochain article !
  • Gérer les intégrations et Lambdas.
  • Configurez les stratégies CORS.
  • Exporter/Importer les définitions OpenAPI.
  • Écrivez les journaux d'accès si nécessaire. Ainsi, chaque fois qu'une demande est envoyée via la passerelle API, la demande est enregistrée dans Cloudwatch. Vous devrez spécifier une destination de groupe de journaux pour cela. Nous verrons cela plus loin dans l'article.
  • Gérer / créer des étapes et ainsi de suite.

Maintenant que nous avons une compréhension de base du fonctionnement d'Amazon API Gateway avec .NET, construisons maintenant une application sans serveur plus avancée qui utilise AWS Lambda, plusieurs gestionnaires de fonctions, Cloudwatch, DynamoDB pour stocker des données, et enfin intégrons tous ces Lambda à l'aide d'une Amazon API Gateway.

Création de la gestion des étudiants AWS Lambda avec .NET

Nous allons créer une API simple qui peut obtenir tous les détails de l'étudiant, obtenir l'étudiant par ID et créer un nouveau dossier étudiant. Ajoutez un nouveau projet Lambda à notre solution et nommez-le StudentLambda. Et oui, nous allons créer plusieurs Lambda à partir d'un seul projet Lambda. Vous êtes libre de créer des projets distincts pour chacune des fonctions. Mais pour la portée actuelle de l'application et des exigences, ce n'est pas vraiment nécessaire. Nous allons regrouper toutes les 3 fonctions Lambda dans un seul projet .NET Lambda et utiliser des FunctionHandlers pour déployer séparément tous les Lambda sur AWS.

Avant de commencer, assurez-vous d'installer les packages Nuget suivants sur votre projet StudentLambda via la console du gestionnaire de packages.

Install-Package Amazon.Lambda.APIGatewayEvents
Install-Package AWSSDK.DynamoDBv2
Install-Package Newtonsoft.Json

Comme vous le savez, le premier package est spécifiquement destiné à l'utilisation des contrats Amazon API Gateway dans notre .NET Lambda.

Le package DynamoDB permet à notre Lambda de communiquer avec notre DynamoDB. Si vous ne savez pas comment fonctionne DynamoDB, j'ai écrit un guide complet à ce sujet ici . J'ai construit une simple API Web CRUD ASP.NET Core qui stocke les données dans une table AWS DynamoDB.

Ensuite, définissons le modèle étudiant. Avec la racine du projet StudentLambda, ajoutez une nouvelle classe et nommez-la Student.cs

namespace StudentLambda
{
[DynamoDBTable("students")]
public class Student
{
[DynamoDBHashKey("id")]
public int? Id { get; set; }
[DynamoDBProperty("first_name")]
public string? FirstName { get; set; }
[DynamoDBProperty("last_name")]
public string? LastName { get; set; }
[DynamoDBProperty("class")]
public int Class { get; set; }
}
}

Accédez maintenant à AWS DynamoDB et créez-y une nouvelle table comme suit.

chrome FCz71W3ljT Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Une fois que vous avez créé la table, AWS prendra quelques secondes pour provisionner la table dans le cloud. Ajoutons un exemple d'enregistrement à cette table. Ouvrez le tableau, appuyez sur Explorer les éléments du tableau -> Créer un élément.

Basculez vers la vue JSON et ajoutez un exemple d'enregistrement comme suit. Notez que les propriétés que j'ai utilisées sont exactement les mêmes que celles que nous avons définies dans notre classe Student.cs. Cliquez sur Créer.

{
"id": 1,
"first_name" : "Mukesh",
"last_name" : "Murugan",
"class" : 10
}

chrome MotUEEQAR1 Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Obtenir tous les étudiants

Écrivons du code pour renvoyer une liste de tous les étudiants de la table DynamoDB. Ouvrez la classe Function.cs de StudentLambda. Supprimez la méthode FunctionHandler par défaut. et ajoutez la fonction suivante.

public async Task<List<Student>> GetAllStudentsAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
var data = await dbContext.ScanAsync<Student>(default).GetRemainingAsync();
return data;
}

Ainsi, cette fonction analyse essentiellement l'intégralité de la table DynamoDB nomme les étudiants et renvoie une liste d'étudiants. Aussi simple que cela. Notez que nous allons créer deux DynamoDB Client et Context pour accéder à nos données depuis AWS Lambda.

Nous déploierons ces Lambda une fois que les 3 seront terminés. Idéalement, le point de terminaison de ce Lambda sera la méthode <amazon-url>/students [GET].

Créer un étudiant

Ensuite, au Same Function.cs de Student Lambda, ajoutons une autre méthode qui sera responsable de la création de nouveaux enregistrements d'étudiants. Ci-dessous la fonction.

public async Task<APIGatewayHttpApiV2ProxyResponse> CreateStudentAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
var studentRequest = JsonConvert.DeserializeObject<Student>(request.Body);
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
await dbContext.SaveAsync(studentRequest);
var message = $"Student with Id {studentRequest?.Id} Created";
LambdaLogger.Log(message);
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

Donc, ici, nous nous attendons à ce que le client envoie un corps JSON avec les détails de l'étudiant.

Ligne #3, nous désérialisons le corps de la requête entrante dans un objet Student. Ensuite, nous créons un contexte de base de données pour accéder à la table dynamoDb et enregistrer le dossier de l'étudiant dans notre base de données. Une fois cela fait, nous renverrons un message de réussite au client en réponse avec un code d'état de 200.

À la ligne 8, vous pouvez remarquer que nous utilisons une instance LambdaLogger pour consigner le message dans Cloudwatch LogGroup de Lambda. Ce point de terminaison sera idéalement la méthode <amazon-url>/students [POST].

Obtenir l'étudiant par ID

Passons à notre dernière fonction lambda, ajoutons une fonction qui peut renvoyer les étudiants en fonction de l'ID envoyé dans la demande. Ce sera une fonction quelque peu différente, car nous devrons récupérer l'ID à partir du paramètre Path de la requête. Par exemple, ce point de terminaison de déploiement ressemblerait à <amazon-url>/students/{id}.

Copiez et collez la méthode suivante dans Function.cs du projet Student Lambda.

public async Task<Student> GetStudentByIdAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
string idFromPath = request.PathParameters["id"];
int id = Int32.Parse(idFromPath);
var student = await dbContext.LoadAsync<Student>(id);
if (student == null) throw new Exception("Not Found!");
return student;
}

En ligne #5, nous extrayons l'identifiant de l'étudiant de la propriété path parameters de la requête. Une fois que nous l'avons récupéré, nous le convertissons en entier et le transmettons à la méthode dynamoDb pour obtenir l'étudiant par Id. Ce dossier d'étudiant est retourné au client en guise de réponse.

Maintenant, toutes les fonctions Lamda sont créées. Déployons-les sur AWS.

Sur Visual Studio, cliquez avec le bouton droit sur le projet StudentLambda et cliquez sur Publier sur AWS Lambda. Nous allons déployer chacune des 3 fonctions, l'une après l'autre.

Il y a 2 points à noter sur l'écran ci-dessous. Le nom de la fonction est 'get-all-students' et le gestionnaire pointe vers la méthode GetAllStudentsAsync. C'est ainsi que nous publions séparément l'ensemble des 3 Lambda. Vous devez avoir compris l'idée maintenant. Une fois ces champs modifiés, cliquez sur Suivant.

devenv lP4870ufPw Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Dans l'écran suivant, vous devrez sélectionner le rôle associé à ce Lambda. Pour commencer, il peut s'agir du rôle AWSLambdaBasicExecution. Cependant, il y a un problème avec cela. Ce rôle particulier fournit un accès uniquement pour exécuter Lambda et écrire les journaux dans Cloudwatch. Mais il n'y a pas d'autorisation d'accéder à notre table DynamoDB, n'est-ce pas ? Nous corrigerons cela après avoir déployé tous les Lambda.

devenv k3q9el3o6D Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

C'est tout, téléchargez le Lambda get-all-students.

Répétez des étapes similaires pour déployer les Lambda restants. Assurez-vous de choisir le rôle déjà créé pour chacun de ces 2 AWS Lambda.

devenv 12JZFkHk21 Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

devenv fycfsY0BNP Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

devenv jD6jBn30hv Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

C'est ça! Voici les Lambda que nous avons créés jusqu'à présent.

chrome yqXn6ON0rX Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Ajout d'autorisations DynamoDB.

Comme mentionné, ajoutons les autorisations DynamoDB requises au rôle que nous avons créé. Accédez à AWS IAM. Accédez à Stratégies et créez-en une avec la spécification suivante. Comme vous le voyez ici, nous avons sélectionné DynamoDB comme service AWS et autorisé toutes les actions DynamoDB ainsi que toutes les ressources.

chrome Ql3GcGoy6E Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Notez que ce n'est pas toujours une bonne idée d'accorder des autorisations complètes à un rôle particulier. Mais pour garder les choses simples, nous le faisons. Vous ne devriez pas faire cela pour les applications de production. N'accordez que les autorisations réellement nécessaires.

Sur la page suivante, donnez un nom à la stratégie et créez-la.

chrome ycODtFF4xn Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Maintenant que nous avons créé la stratégie, attachons-la à nos rôles. Sélectionnez la politique nouvellement créée dans la liste et cliquez sur Attacher. Sur la page suivante, vous devrez sélectionner le rôle/utilisateur/groupe auquel vous souhaitez attacher cette politique.

chrome BXL706oAoM Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Dans notre cas, c'est lambda_exec_get-all-students

chrome mAu7ftXH2A Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Voilà. Nous avons réussi à associer la stratégie au rôle utilisé par notre AWS Lambda. Désormais, Lambda doit disposer de suffisamment d'autorisations pour fonctionner avec DynamoDb.

Câblage d'Amazon API Gateway avec .NET AWS Lambda

Vient ensuite la partie cruciale du guide, pour créer une passerelle API qui déclenche chacun de ces lambdas. Ouvrez Amazon API Gateway depuis AWS Management Console.

Jusqu'à présent, nous n'avons créé qu'une seule API Gateway qui est hello . Créez une nouvelle passerelle API. Comme d'habitude, sélectionnez le type d'API HTTP et appuyez sur Build.

Nous avons nommé notre passerelle en tant qu'étudiants et ajouté les 3 Lambda en tant qu'intégrations. Simple, non ?

chrome j6Rwc9eHTU Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Dans la page suivante, nous allons configurer nos itinéraires. Nous allons modifier les valeurs par défaut et ajouter la configuration ci-dessous.

chrome HTdaHTJd1a Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

  • GET /students invoquerait le get-all-students
  • GET /students/{id} appellerait get-student-by-id où id est le paramètre de chemin de la requête. Par exemple, /étudiants/1
  • Enfin, le POST /students créerait un nouvel étudiant, étant donné que nous avons transmis les détails du nouvel étudiant en tant que charge utile JSON de la requête.
     

Laissez l'étape par défaut et continuez à créer la passerelle.

chrome b5Pqmem97h Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Voilà, c'est ça. Testons ce point de terminaison avec Postman.

Tout d'abord, je teste le get-al-students Lambda. J'ai envoyé une requête GET à <url>/students. Comme prévu, vous voyez une liste d'étudiants comme réponse. Pour l'instant, nous n'avons qu'un seul enregistrement dans notre base de données.

Postman IEQHc2RddV Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Ensuite, testons le Get-student-by-id Lambda. J'ai envoyé une requête GET à <url>/students/1. Et à juste titre, il renvoie les détails de l'étudiant avec Id 1.

Postman Z6R9hqnoka Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Enfin, créons un nouvel étudiant. Envoyé une requête POST au point de terminaison <url>/students avec les détails de l'étudiant. Et la réponse est que notre étudiant est créé avec ID 2 !

Postman 7lDzMoDjEr Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Aussi, rappelez-vous que nous avons écrit un petit Logger dans notre Lambda Create-Student? Naviguons vers Cloudwatch / Log Groups / create-student et vérifions les journaux.

chrome kBWX1ReSVr Amazon API Gateway avec .NET - Intégrations AWS Lambda et DynamoDB

Vous pouvez voir que notre message de journal est également imprimé ici.

C'est un enveloppement pour cet article complet. Dans le prochain article, nous apprendrons comment sécuriser la passerelle API avec Lambda Authorizer ! Pour l'instant, la passerelle API que nous avons créée est un point de terminaison public.

CONSEIL important : assurez-vous de toujours supprimer les ressources AWS que vous avez créées une fois que vous avez fini de les explorer. Cela aide à réduire les coûts encourus, bien que le niveau GRATUIT vous fournisse une quantité assez décente de demandes GRATUITES avec lesquelles travailler.

Sommaire

Dans cet article, nous avons appris comment démarrer avec Amazon API Gateway avec .NET. Ici, nous avons appris à créer des Lambdas de base compatibles avec Amazon API Gateway, à les intégrer à DynamoDB, à ajouter plusieurs Lambdas à une passerelle particulière, à la journalisation et bien plus encore. Cela vous donnera une idée solide pour travailler avec l'application AWS Serverless. Dans la prochaine partie de cette application AWS Serverless avec .NET, nous explorerons comment sécuriser les passerelles API, travailler avec SAM et bien plus encore. Restez à l'écoute. Vous pouvez suivre cette newsletter pour recevoir des notifications lorsque je publie de nouveaux articles – https://www.getrevue.co/profile/iammukeshm

Partagez cet article avec vos collègues et cercles de développement si vous avez trouvé cela intéressant. Vous pouvez trouver le  code source du projet  ici. Merci!  

 Source : https://codewithmukesh.com/blog/amazon-api-gateway-with-dotnet/

#dotnet #amazon #api 

Passerelle d'API Amazon avec .NET
Thai  Son

Thai Son

1660050900

Amazon API Gateway với .NET

Trong bài viết tổng hợp này, chúng ta sẽ tìm hiểu Amazon API Gateway với ngăn xếp .NET. Sử dụng điều này, chúng tôi sẽ có thể đưa AWS Lambdas ra thế giới bên ngoài một cách khá dễ dàng.

Trong bài viết trước, chúng ta đã tìm hiểu về cách làm việc với AWS Lambda bằng cách sử dụng .NET, đây là một điểm quan trọng để bắt đầu với các ứng dụng Serverless. Mặc dù chúng tôi đã xây dựng và triển khai các Lambdas đó trên AWS, nhưng chúng tôi chưa bao giờ thực sự thảo luận về cách chúng tôi sẽ khiến chúng bị thế giới bên ngoài gọi ra.

Tiếp tục trong hướng dẫn toàn diện này, chúng tôi sẽ xây dựng một ứng dụng không máy chủ hoàn chỉnh tích hợp liền mạch giữa Amazon API Gateway, Lambda, DynamoDb cho Persistence và Cloudwatch cho mục đích ghi nhật ký.

Bạn có thể tìm thấy mã nguồn của việc triển khai tại đây .

Amazon API Gateway là gì?

Amazon API Gateway là một dịch vụ được quản lý hoàn toàn cho phép bạn tạo Cổng, về cơ bản đóng vai trò như một cánh cửa dẫn vào thế giới logic kinh doanh cho ứng dụng của bạn. Với dịch vụ này, về cơ bản bạn để lộ các điểm cuối khi truy cập kết nối với AWS Lambdas, điểm cuối công khai và nhiều Dịch vụ AWS khác tùy thuộc vào cách bạn xây dựng Amazon API Gateway.

Giả sử một số ứng dụng chạy trên internet cần quyền truy cập vào logic nghiệp vụ nằm trong lambda của bạn. Các ứng dụng khách này sẽ kết nối với Amazon API Gateway, nội bộ sẽ chuyển hướng yêu cầu đến AWS Lambda được liên kết hoặc các dịch vụ khác mà bạn đã định cấu hình.

Chúng ta hãy xem xét biểu diễn dạng sơ đồ về luồng yêu cầu chung sẽ trông như thế nào thông qua API Gateway.

Amazon API Gateway với .NET

Như bạn có thể thấy, khách hàng truy cập Cổng kết nối nội bộ với một dịch vụ. Ví dụ,

  • www. <url-of-aws-gateway> / test -> sẽ chuyển hướng đến lambda có tên test-lambda
  • www. <url-of-aws-gateway> / get-Students -> sẽ chuyển hướng đến lambda trả về danh sách sinh viên
  • www. <url-of-aws-gateway> / weather? city = trivandrum -> sẽ chuyển hướng đến điểm cuối API thời tiết công cộng, điểm cuối này sẽ trả về dữ liệu thời tiết của thành phố Trivandrum.

Giờ đây, Cổng API thường là một phần quan trọng của toàn bộ hệ sinh thái AWS Serverless vì nó làm cho việc truy cập Dịch vụ AWS của chúng tôi trở nên khá thú vị và dễ dàng ở mọi quy mô.

API AWS REST so với API HTTP

AWS hỗ trợ hai phiên bản của Dịch vụ cổng API. Bản phát hành ban đầu dành cho biến thể REST API bao gồm rất nhiều tính năng để thiết kế, phát triển và duy trì API Gateway của bạn. Sau đó, vào khoảng năm 2019, AWS giới thiệu các API HTTP giúp đơn giản hóa việc tạo và triển khai Gateway. Đừng nhầm lẫn với việc đặt tên, cả hai phiên bản này đều được xây dựng trên giao thức HTTP tuân theo các quy ước REST. AWS nội bộ đặt tên chúng là v1 (API REST) ​​và v2 (API HTTP)

Có khá nhiều khác biệt đáng kể giữa các phiên bản này bao gồm hiệu suất, giá cả và trải nghiệm phát triển. Tóm lại, HTTP Apis chiến thắng ở hầu hết các phòng ban và nên là lựa chọn của bạn hầu hết thời gian.

  • Đầu tiên, các API HTTP có nghĩa là có hiệu suất tốt hơn và gần như hiệu quả hơn 10-15% so với API REST.
  • Về giá cả, đối với 300 Triệu yêu cầu đầu tiên mỗi tháng, API HTTP sẽ khiến bạn chỉ mất 1 USD, trong khi, đối với cùng một khối lượng, API REST có giá khoảng 3,5 USD. Đây là một sự khác biệt rất lớn. Lưu ý rằng Bậc miễn phí của AWS bao gồm 1 triệu API (REST & HTTP) mỗi tháng trong 12 tháng đầu tiên hoàn toàn miễn phí. Đủ thời gian để khám phá cả hai công nghệ thú vị này, phải không?
  • Trải nghiệm người dùng do bảng điều khiển AWS cung cấp trong khi phát triển các cổng này hoàn toàn khác với nhau.
  • REST API hỗ trợ các điểm cuối được tối ưu hóa cạnh để đảm bảo rằng các điểm cuối của bạn được phân phối cao trên toàn cầu, trong khi các điểm cuối HTTP chỉ hỗ trợ triển khai theo khu vực, điều này có thể góp phần làm chậm phản hồi một chút.
  • Cả hai điều này đều có tính bảo mật cao.
  • Việc triển khai Canary được bao gồm với API REST chứ không phải với API HTTP nếu đây là một vấn đề lớn đối với chiến lược triển khai của bạn.

Để so sánh thêm, hãy tham khảo hướng dẫn dành cho nhà phát triển của AWS để so sánh cả hai phiên bản này. Mặc dù các API HTTP rẻ hơn REST, nhưng chắc chắn có khá nhiều tính năng được bao gồm trong API REST để biện minh cho sự khác biệt về giá cả.

Đối với phần trình diễn của chúng tôi, chúng tôi sẽ sử dụng các API HTTP. Có thể trong một bài viết sau, chúng ta sẽ tìm hiểu các API REST. Về mặt khái niệm, cả hai điều này gần như giống nhau. Chúng tôi sẽ sử dụng Cộng đồng Visual Studio 2022 cùng với tiện ích mở rộng AWS SDK Kit như chúng tôi đã làm trong bài viết trước trên Lambda để phát triển, thử nghiệm, thử nghiệm và xuất bản Lambdas của chúng tôi lên Đám mây AWS.

Điều quan trọng là bạn đã xem qua bài viết trước về AWS Lambda trên .NET, nơi chúng tôi đã thiết lập Thông tin đăng nhập AWS qua CLI, Cài đặt Bộ công cụ AWS trên Visual Studio Code. Nếu không, hãy tham khảo bài đăng trên blog này.

Xây dựng và xuất bản AWS Lambda với .NET

Đầu tiên, hãy mở Visual Studio 2022 và tạo một giải pháp trống. Tôi đặt tên giải pháp của mình là AWSServerless.Dotnet.Demo . Về cơ bản, chúng tôi sẽ có 2 dự án Lambda trong này, chúng tôi sẽ bổ sung dần dần.

  1. Một Lambda giả trả lại tin nhắn Xin chào. Lambda này sẽ được sử dụng để giới thiệu các thông tin và kiến ​​thức cơ bản về tích hợp Amazon API Gateway.
  2. Một Student Lambda, mà chúng tôi sẽ thêm nhiều trình xử lý Hàm có thể thực hiện một số hoạt động CRUD cơ bản đối với DynamoDB. (Tái bút, tôi đã viết một bài báo về Bắt đầu với DynamoDB bằng .NET. Bạn cũng nên kiểm tra.)

Trước khi tiếp tục, hãy đảm bảo rằng bạn đã có những điều sau đây.

  • Thiết lập thông tin đăng nhập AWS qua AWS CLI.
  • Bộ công cụ AWS được cài đặt trên Cài đặt Visual Studio của bạn.
  • Có Tài khoản AWS. Một Bậc miễn phí sẽ là quá đủ.

Bạn có thể xem thêm thông tin liên quan đến các bước trên trong các bài viết trước của tôi về Ứng dụng AWS Serverless với .NET.

tạo dự án trống không có máy chủ Amazon API Gateway với .NET - AWS Lambda & DynamoDB Tích hợp

Hãy thêm dự án Lambda đầu tiên của chúng tôi vào Giải pháp trống của chúng tôi. Nhấp chuột phải vào Giải pháp tại Visual Studio và nhấn Thêm dự án mới. Giả sử rằng bạn đã cài đặt Bộ công cụ AWS trên Phiên bản Visual Studio của mình, bạn có thể tìm kiếm AWS Lambda trong cửa sổ bật lên 'Thêm dự án mới' xuất hiện.

devenv iArkd7DjVv Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Nhấp vào Tiếp theo. Ở đây chúng ta hãy đặt tên lambda HelloLambda. Như đã đề cập trước đó, đây sẽ là một lambda đơn giản giúp chúng ta hiểu toàn bộ quá trình tích hợp với Amazon API Gateway với .NET sẽ như thế nào. Khi bạn được nhắc chọn một bản thiết kế cho lambda mới của mình, hãy chọn `` Chức năng trống ''. Điều này cung cấp cho chúng tôi một phương tiện rõ ràng để bắt đầu xây dựng Lambda đơn giản của chúng tôi.

Bạn đã quen với cấu trúc thư mục của Dự án AWS Lambda. Nếu chưa, hãy xem qua bài viết này. Mở Function.cs / FunctionHandler. Bây giờ chúng ta sẽ đính kèm Trình xử lý này với Cổng API của mình, chúng ta cần thực hiện một số sửa đổi nhỏ đối với chữ ký của phương thức này. Nhưng trước đó, hãy cài đặt một gói cho dự án Lambda này có chứa các hợp đồng. Bạn có thể mở Bảng điều khiển Trình quản lý Gói và chạy phần sau để cài đặt gói.

Install-Package Amazon.Lambda.APIGatewayEvents

Hãy bắt đầu và thay đổi FunctionHandler của chúng ta ngay bây giờ.

public APIGatewayHttpApiV2ProxyResponse FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
request.QueryStringParameters.TryGetValue("name", out var name);
name = name ?? "John Doe";
var message = $"Hello {name}, from AWS Lambda";
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

APIGatewayHttpApiV2ProxyRequest đại diện cho yêu cầu đến từ một API HTTP. Nếu bạn nghĩ về điều đó hoặc nếu bạn nhìn lại sơ đồ luồng đầu tiên mà chúng tôi có, yêu cầu mà Lambda nhận được không phải trực tiếp từ khách hàng, mà là yêu cầu từ chính Amazon API Gateway. Vì vậy, trong trường hợp này, API Gateway sẽ gửi một yêu cầu đến Lambda với kiểu APIGatewayHttpApiV2ProxyRequest . Tương tự, APIGatewayHttpApiV2ProxyResponse là loại phản hồi mà Lambda trả lại cho Amazon API Gateway. Bạn cũng có thể bỏ qua phần phản hồi này và thay vào đó trả lại một số dữ liệu quan trọng theo yêu cầu kinh doanh, chẳng hạn như danh sách Học viên, mà chúng tôi sẽ thực hiện trong khi xây dựng Lambda tiếp theo của chúng tôi sâu hơn trong hướng dẫn này.

Vì vậy, đây là những thay đổi lớn trong Lambda để hỗ trợ toàn bộ tính năng tích hợp API Gateway. Ngoài ra, trình xử lý Hàm giờ đây trả về một thông báo có nội dung “Xin chào {name}, từ AWS Lambda”. Một điều khác ở đây là, từ bên trong Lambda, bạn có thể truy cập vào ngữ cảnh đến, bao gồm Chuỗi truy vấn, Tham số đường dẫn, Đường dẫn, v.v. Đối với Lambda này, tôi hy vọng yêu cầu đến sẽ có tham số Truy vấn là tên (… / hello? Name = Mukesh), sau đó sẽ được thêm vào thông báo mà nó trả về cuối cùng.

Nếu Tham số truy vấn không tồn tại, nó sẽ tiếp tục với tên mặc định, đó là John Doe. Lưu ý rằng chúng tôi đang trả lại phản hồi dưới dạng loại APIGatewayHttpApiV2ProxyResponse, trong đó Body là thông báo thực và chúng tôi cung cấp mã trạng thái là 200 SUCCESS.

Đó là nó cho Lambda đầu tiên của chúng tôi. Hãy xuất bản nó lên AWS và Mock Kiểm tra nó cục bộ trong Visual Studio. Nhấp chuột phải vào dự án HelloLambda và nhấp vào Xuất bản lên AWS Lambda. Bạn sẽ thấy cửa sổ bật lên sau.

hình ảnh Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Một số chi tiết đầu tiên được công cụ điền tự động, với điều kiện là bạn đã thiết lập Thông tin đăng nhập AWS địa phương, Khu vực và hồ sơ của mình.

  • Tên hàm là tên mà Lambda sẽ được nhận dạng trên tài khoản AWS của bạn.
  • Mô tả - như tên cho thấy.
  • Xử lý là khá quan trọng ở đây. Giả sử Function.cs của bạn có thể có nhiều phương thức Xử lý. Phương thức Handler này ánh xạ đến chức năng chính xác mà bạn cần Lambda của mình trỏ tới. Trong trường hợp của chúng ta, đó là HelloLambda :: HelloLambda.Function :: FunctionHandler. Hãy ghi nhớ điều này, vì chúng tôi sẽ sử dụng trường này ở phần sau trong bài viết của chúng tôi.

Nhấn tiếp.

devenv oEzQI2HY6h Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Trong màn hình tiếp theo, thay đổi duy nhất bạn sẽ phải làm là chọn đúng vai trò cần thiết. Trong trường hợp của chúng tôi, đó là AWSLambdaBasicExecutionRole. Điều này đi kèm với quyền ghi Nhật ký vào AWS Cloudwatch. Đó là nó. Nhấp vào Tải lên. AWS bắt đầu tạo các Vai trò cần thiết, chạy một số lệnh để xây dựng và phát hành cục bộ Lambda của bạn, nén các thư viện đã xuất bản và tải nó lên AWS, cuối cùng tạo ra Lambda sáng bóng mới của bạn.

Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Sau khi hoàn tất, bạn có thể mở Bảng điều khiển quản lý AWS, điều hướng đến Lambdas và xác minh rằng Lambda mới của chúng tôi đã được tạo.

image 2 Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Quay lại Visual Studio, bạn có thể thấy rằng Publish Wizard sẽ mở ra một công cụ nhỏ giúp kiểm tra Lambda Straight từ Visual Studio. Ồ, và nếu bạn chưa biết, bạn cũng có thể chỉ cần chạy ứng dụng Lambda ở chế độ Gỡ lỗi và Visual Studio sẽ kích hoạt Công cụ Mock về cơ bản giúp kiểm tra và gỡ lỗi mã Lambda của bạn.

Bây giờ, chúng ta hãy khám phá công cụ được tích hợp trong giao diện Visual Studio. Đây là một ảnh chụp màn hình bên dưới.

image 1 Amazon API Gateway với .NET - AWS Lambda & DynamoDB Tích hợp

Đầu tiên, giao diện này cho phép bạn gửi các yêu cầu giả trực tiếp đến Lambda của bạn đã được triển khai tới AWS. Nhấp vào menu thả xuống Yêu cầu mẫu và chọn API Gateway AWS Proxy. Công cụ sẽ điền vào một yêu cầu mẫu. Ở đây, như tôi đã làm, bạn có thể thêm khóa tên / giá trị vào các tham số chuỗi Truy vấn. Có khá nhiều tài sản để tìm kiếm xung quanh đây. Khi bạn nhấp vào Gọi, phản hồi sẽ có thông báo của chúng tôi với mã Trạng thái là 200.

Bây giờ, mặc dù Lambda đã sẵn sàng, chúng tôi thực sự không có cách nào để truy cập chức năng này ngoài các công cụ gỡ lỗi VS. Vì vậy, chúng tôi cần một liên kết / điểm cuối mà chúng tôi gửi yêu cầu và chúng tôi mong đợi một yêu cầu tương tự từ Lambda. Đây là nơi Amazon API Gateway xuất hiện trong bức tranh.

Tạo Amazon API Gateway với .NET

Hãy bắt đầu thiết kế Cổng API Amazon đầu tiên của chúng tôi. Tìm kiếm API Gateway trong thanh tìm kiếm mà bạn thấy trong Bảng điều khiển quản lý AWS. Bạn sẽ thấy trang đích mặc định cho Amazon API Gateway. Tại đây, bạn sẽ thấy các lựa chọn để chọn Loại API. Vì chúng tôi sẽ sử dụng API HTTP, hãy nhấp vào nút Xây dựng được liên kết với nó.

chrome HZudzLTStT Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Cho rằng Lambda của chúng tôi đã được tạo thành công, bạn có thể chọn kiểu Tích hợp là Lambda và chọn hàm hello Lambda của chúng tôi. Đảm bảo chúng tôi tuân theo Phiên bản 2.0 của tải trọng vì đây là phiên bản mới nhất. Ngoài ra, hãy đảm bảo chọn đúng khu vực AWS. Trong trường hợp của tôi, đó là ap-nam-1. Sau khi hoàn thành, hãy nhấp vào tiếp theo.

chrome ZaswQgDPsT Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Tiếp theo là một phần thú vị, nơi chúng tôi định cấu hình các tuyến đường thực tế có thể gọi hello Lambda của chúng tôi. Bạn có thể thấy rằng tôi đã đặt nó thành một phương thức GET sẽ có điểm cuối là / hello và sẽ nhắm mục tiêu đến Hello Lambda. Vì vậy, về cơ bản, khi chúng tôi tạo Cổng API, AWS sẽ cung cấp cho chúng tôi một URL Điểm cuối, mà nếu chúng tôi thêm a / hello và gửi phương thức GET với các tham số truy vấn thích hợp sẽ kích hoạt Lambda và trả về Phản hồi dự kiến.

Lưu ý rằng bạn có thể nhiều tuyến đường và tích hợp ở đây. Chúng tôi sẽ khám phá điều này khi chúng tôi tạo Cổng API đầy đủ của chúng tôi trong phần sau của bài viết này.

chrome 1j5EYx3xWe Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Tiếp theo, Wizard sẽ yêu cầu chúng ta tạo các giai đoạn. Điều này sẽ hữu ích nếu chúng ta muốn triển khai Amazon API Gateway của mình cho các giai đoạn khác nhau như dev, prod và staging. Nhưng hiện tại, hãy giữ nó làm giá trị mặc định là `$ default` và nhấp vào Tiếp theo.

Tại đây, bạn có thể xem lại các thay đổi của mình và Triển khai Gateway của mình. Đó là nó, đơn giản như vậy.

Trong màn hình bên dưới, bạn có thể thấy URL của Amazon API Gateway mà chúng tôi vừa tạo. Sao chép cái này và mở Postman hoặc bất kỳ công cụ kiểm tra API nào bạn sử dụng. Ngoài ra, vì nó chỉ là một phương pháp GET, bạn có thể sử dụng Trình duyệt để kiểm tra Gateway của chúng tôi.

chrome kmkvkIZHmM Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Hãy kiểm tra API Gateway của chúng tôi sẽ phản hồi như thế nào. Tôi sẽ sử dụng Postman để thử nghiệm. Đảm bảo rằng đó là phương thức GET, nếu không Gateway sẽ thông báo rằng không tìm thấy điểm cuối như vậy.

Trong ảnh chụp màn hình bên dưới, bạn có thể thấy rằng tôi đã gửi một yêu cầu đến điểm cuối / hello và chuyển tên tham số truy vấn làm Tên của tôi và bạn cũng có thể thấy phản hồi mong đợi từ Lambda. Khá đơn giản phải không? Vui lòng truy cập Hello Lambda để hiểu thêm về nó.

Postman 09XFb6JnKd Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Khám phá giao diện bảng điều khiển Amazon API Gateway

Bây giờ chúng tôi đã tạo Cổng API Amazon đầu tiên của mình với AWS Lambdas do .NET hỗ trợ, hãy cùng khám phá Giao diện và Tính năng được cung cấp trên Cổng API Amazon.

Trên trang chủ, bạn có thể xem danh sách các Cổng do bạn tạo trong một Vùng AWS cụ thể.

chrome RYg52eeVpW Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Khi bạn đi vào một API Gateway cụ thể, bạn sẽ có quyền truy cập vào một loạt các tính năng thú vị để điều chỉnh Gateway của mình.

chrome C3lh3VJBk3 Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Từ đây, bạn có thể:

  • Thêm các tuyến đường khác vào Amazon API Gateway hiện có.
  • Bảo mật Amazon API Gateway bằng Lambdas và JWT. Chúng ta sẽ đi sâu tìm hiểu vấn đề này trong bài viết tiếp theo!
  • Quản lý Tích hợp và Lambdas.
  • Định cấu hình Chính sách CORS.
  • Xuất / Nhập định nghĩa OpenAPI.
  • Ghi Nhật ký truy cập nếu cần. Vì vậy, mỗi khi có yêu cầu được gửi qua cổng API, yêu cầu đó sẽ được đăng nhập vào Cloudwatch. Bạn sẽ phải chỉ định đích đến của Log Group cho việc này. Chúng ta sẽ xem xét vấn đề này ở phần sau của bài viết.
  • Quản lý / Tạo giai đoạn, v.v.

Bây giờ chúng ta đã có hiểu biết cơ bản về cách hoạt động của Amazon API Gateway với .NET, bây giờ chúng ta hãy xây dựng một ứng dụng Serverless nâng cao hơn sử dụng AWS Lambda, nhiều Trình xử lý chức năng, Cloudwatch, DynamoDB để lưu trữ dữ liệu và cuối cùng tích hợp tất cả những Lambdas này bằng cách sử dụng Amazon API Gateway.

Quản lý sinh viên xây dựng AWS Lambda với .NET

Chúng tôi sẽ xây dựng một API đơn giản có thể lấy tất cả thông tin chi tiết về sinh viên, lấy sinh viên theo ID và tạo hồ sơ Sinh viên mới. Thêm một dự án Lambda mới vào Giải pháp của chúng tôi và đặt tên là StudentLambda. Và vâng, chúng tôi sẽ tạo nhiều Lambda từ một Dự án Lambda duy nhất. Bạn có thể tự do tạo các dự án riêng biệt cho từng chức năng. Nhưng đối với phạm vi ứng dụng và yêu cầu hiện tại, nó không thực sự cần thiết. Chúng tôi sẽ nhồi tất cả 3 hàm Lambda vào một dự án .NET Lambda duy nhất và sử dụng FunctionHandlers để triển khai riêng biệt tất cả các Lambda sang AWS.

Trước khi bắt đầu, hãy đảm bảo cài đặt các gói Nuget sau vào dự án StudentLambda của bạn thông qua Bảng điều khiển Trình quản lý Gói.

Install-Package Amazon.Lambda.APIGatewayEvents
Install-Package AWSSDK.DynamoDBv2
Install-Package Newtonsoft.Json

Như bạn đã biết, gói đầu tiên dành riêng cho việc sử dụng các hợp đồng Amazon API Gateway trong .NET Lambda của chúng tôi.

Gói DynamoDB cho phép Lambda của chúng tôi giao tiếp với DynamoDB của chúng tôi. Nếu bạn không biết cách hoạt động của DynamoDB, tôi đã viết một hướng dẫn đầy đủ về nó ở đây . Tôi đã xây dựng một CRUD ASP.NET Core WebAPI đơn giản để lưu trữ dữ liệu vào bảng AWS DynamoDB.

Tiếp theo, hãy xác định Mô hình Sinh viên. Với gốc của dự án StudentLambda, thêm một lớp mới và đặt tên là Student.cs

namespace StudentLambda
{
[DynamoDBTable("students")]
public class Student
{
[DynamoDBHashKey("id")]
public int? Id { get; set; }
[DynamoDBProperty("first_name")]
public string? FirstName { get; set; }
[DynamoDBProperty("last_name")]
public string? LastName { get; set; }
[DynamoDBProperty("class")]
public int Class { get; set; }
}
}

Bây giờ điều hướng đến AWS DynamoDB và tạo một bảng mới ở đó như sau.

chrome FCz71W3ljT Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Sau khi bạn tạo bảng, AWS sẽ mất vài giây để cung cấp Bảng cho đám mây. Hãy thêm một bản ghi mẫu vào bảng này. Mở Bảng, nhấn Khám phá Mục trong Bảng -> Tạo Mục.

Chuyển sang dạng xem JSON và thêm bản ghi mẫu như sau. Lưu ý rằng các thuộc tính tôi đã sử dụng hoàn toàn giống với các thuộc tính mà chúng tôi đã xác định trong lớp Student.cs của mình. Nhấp vào Tạo.

{
"id": 1,
"first_name" : "Mukesh",
"last_name" : "Murugan",
"class" : 10
}

chrome MotUEEQAR1 Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Nhận tất cả học sinh

Hãy viết một số mã để trả về danh sách tất cả sinh viên từ bảng DynamoDB. Mở lớp Function.cs của StudentLambda. Loại bỏ phương thức FunctionHandler mặc định. và thêm chức năng sau.

public async Task<List<Student>> GetAllStudentsAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
var data = await dbContext.ScanAsync<Student>(default).GetRemainingAsync();
return data;
}

Vì vậy, chức năng này về cơ bản quét toàn bộ Bảng DynamoDB đặt tên các học sinh và trả về danh sách các Học sinh. Đơn giản vậy thôi. Lưu ý rằng chúng tôi sẽ tạo một vài Ứng dụng khách và Ngữ cảnh DynamoDB để truy cập dữ liệu của chúng tôi từ AWS Lambda.

Chúng tôi sẽ triển khai các Lambdas này sau khi cả 3 hoàn thành. Lý tưởng nhất là điểm cuối cho Lambda này sẽ là Phương thức <amazon-url> / Students [GET].

Tạo sinh viên

Tiếp theo, tới Same Function.cs của Student Lambda, hãy thêm một phương thức khác sẽ chịu trách nhiệm tạo hồ sơ sinh viên mới. Dưới đây là chức năng.

public async Task<APIGatewayHttpApiV2ProxyResponse> CreateStudentAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
var studentRequest = JsonConvert.DeserializeObject<Student>(request.Body);
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
await dbContext.SaveAsync(studentRequest);
var message = $"Student with Id {studentRequest?.Id} Created";
LambdaLogger.Log(message);
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

Vì vậy, ở đây chúng tôi mong đợi khách hàng gửi một phần thân JSON với thông tin chi tiết về sinh viên.

Dòng # 3, chúng tôi giải mã nội dung yêu cầu đến thành một đối tượng Sinh viên. Sau đó, chúng tôi tạo một ngữ cảnh DB để truy cập bảng DyoDb và Lưu hồ sơ học sinh vào cơ sở dữ liệu của chúng tôi. Sau khi hoàn tất, chúng tôi sẽ gửi lại thông báo thành công cho khách hàng dưới dạng phản hồi với mã trạng thái là 200.

Tại Dòng # 8, bạn có thể nhận thấy rằng chúng tôi đang sử dụng phiên bản LambdaLogger để ghi thông báo vào Cloudwatch LogGroup của Lambda. Điểm cuối này lý tưởng sẽ là phương thức <amazon-url> / Students [POST].

Nhận sinh viên bằng ID

Tiến tới Hàm lambda cuối cùng của chúng ta, hãy thêm một hàm có thể trả về sinh viên dựa trên ID được gửi trong yêu cầu. Đây sẽ là một Hàm hơi khác, vì chúng ta sẽ phải tìm nạp ID từ Tham số đường dẫn của yêu cầu. Ví dụ: điểm cuối triển khai này sẽ giống như <amazon-url> / students / {id}.

Sao chép Dán phương pháp sau vào Function.cs của dự án Student Lambda.

public async Task<Student> GetStudentByIdAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
string idFromPath = request.PathParameters["id"];
int id = Int32.Parse(idFromPath);
var student = await dbContext.LoadAsync<Student>(id);
if (student == null) throw new Exception("Not Found!");
return student;
}

Trong Dòng # 5, chúng tôi đang trích xuất id sinh viên từ thuộc tính tham số đường dẫn của yêu cầu. Sau khi chúng tôi tìm nạp nó, chúng tôi chuyển đổi nó thành một số nguyên và chuyển nó sang phương thức DyoDb để lấy sinh viên theo Id. Hồ sơ học sinh này được trả lại cho khách hàng như một phản hồi.

Bây giờ, tất cả các hàm Lamda đã được tạo. Hãy triển khai chúng lên AWS.

Trên Visual Studio, nhấp chuột phải vào dự án StudentLambda và nhấp vào Xuất bản lên AWS Lambda. Chúng tôi sẽ triển khai từng chức năng trong số 3 chức năng này sau cái khác.

Có 2 điểm cần lưu ý trên màn hình dưới đây. Tên hàm là 'get-all-students' và Trình xử lý trỏ đến phương thức GetAllStudentsAsync. Đây là cách chúng tôi xuất bản riêng tất cả 3 Lambda. Chắc hẳn bây giờ bạn đã có ý tưởng. Sau khi các trường này được thay đổi, hãy nhấp vào Tiếp theo.

devenv lP4870ufPw Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Trong màn hình tiếp theo, bạn sẽ cần chọn vai trò liên quan đến Lambda này. Đối với người mới bắt đầu, nó có thể là Vai trò AWSLambdaBasicExecution. Tuy nhiên, có một vấn đề với điều này. Vai trò cụ thể này chỉ cung cấp quyền truy cập để thực thi Lambda và ghi nhật ký vào Cloudwatch. Nhưng không có quyền truy cập vào bảng DynamoDB của chúng ta, phải không? Chúng tôi sẽ sửa lỗi này sau khi triển khai tất cả các Lambdas.

devenv k3q9el3o6D Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Vậy là xong, tải lên Lambda get-all-students.

Lặp lại các bước tương tự để triển khai các Lambdas còn lại. Đảm bảo rằng bạn chọn Vai trò đã được tạo cho mỗi 2 AWS Lambda này.

devenv 12JZFkHk21 Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

devenv fycfsY0BNP Cổng API Amazon với .NET - Tích hợp AWS Lambda & DynamoDB

devenv jD6jBn30hv Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Đó là nó! Đây là những chiếc Lambdas mà chúng tôi đã tạo ra cho đến bây giờ.

chrome yqXn6ON0rX Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Thêm quyền DynamoDB.

Như đã đề cập, hãy thêm Quyền DynamoDB bắt buộc vào vai trò mà chúng tôi đã tạo. Điều hướng đến AWS IAM. Đi tới Chính sách và tạo một chính sách với đặc điểm kỹ thuật sau. Như bạn thấy ở đây, chúng tôi đã chọn DynamoDB làm Dịch vụ AWS và cho phép tất cả các hành động DynamoDB cũng như tất cả các tài nguyên.

chrome Ql3GcGoy6E Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Lưu ý rằng không phải lúc nào cũng là ý kiến ​​hay khi cấp các quyền hoàn chỉnh cho một vai trò cụ thể. Nhưng để giữ mọi thứ đơn giản, chúng tôi đang làm như vậy. Bạn không nên làm điều này cho các ứng dụng sản xuất. Chỉ cung cấp các quyền thực sự được yêu cầu.

Trên trang tiếp theo, đặt tên cho chính sách và tạo nó.

chrome ycODtFF4xn Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Bây giờ chúng ta đã tạo chính sách, hãy gắn nó vào Vai trò của chúng ta. Chọn chính sách mới được tạo từ danh sách và nhấp vào đính kèm. Trên trang tiếp theo, bạn sẽ phải chọn vai trò / người dùng / nhóm mà bạn muốn đính kèm chính sách này.

chrome BXL706oAoM Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Trong trường hợp của chúng tôi, đó là lambda_exec_get-all-sinh viên

chrome mAu7ftXH2A Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Của bạn đây. Chúng tôi đã đính kèm thành công chính sách với vai trò được AWS Lambda của chúng tôi sử dụng. Bây giờ Lambda sẽ có đủ quyền để làm việc với DynamoDb.

Kết nối Amazon API Gateway với .NET AWS Lambda

Tiếp theo là phần quan trọng của hướng dẫn, để thực sự xây dựng một Cổng API để kích hoạt từng lambdas này. Mở Amazon API Gateway từ Bảng điều khiển quản lý AWS.

Cho đến nay, chúng tôi chỉ tạo ra một API Gateway duy nhất . Tạo một Cổng API mới. Như thường lệ, hãy chọn loại API HTTP và nhấn Xây dựng.

Chúng tôi đặt tên Gateway là học sinh và thêm tất cả 3 Lambdas làm Tích hợp. Đơn giản, phải không?

chrome j6Rwc9eHTU Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Trong trang tiếp theo, chúng tôi sẽ định cấu hình các tuyến đường của chúng tôi. Chúng tôi sẽ thay đổi các giá trị mặc định và thêm cấu hình bên dưới.

chrome HTdaHTJd1a Amazon API Gateway với .NET - AWS Lambda & DynamoDB Tích hợp

  • GET / sinh viên sẽ gọi tất cả sinh viên
  • GET / Students / {id} sẽ gọi get-student-by-id trong đó id là tham số đường dẫn của yêu cầu. Ví dụ, / sinh viên / 1
  • Cuối cùng, POST / sinh viên sẽ tạo một sinh viên mới, vì chúng tôi đã chuyển thông tin chi tiết của sinh viên mới dưới dạng tải trọng JSON của yêu cầu.
     

Để sân khấu như mặc định và tiếp tục tạo Cổng.

chrome b5Pqmem97h Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Đó là nó. Hãy cùng Postman kiểm tra điểm cuối này.

Đầu tiên, tôi đang thử nghiệm Lambda get-al-Students. Tôi đã gửi một yêu cầu GET tới <url> / sinh viên. Như mong đợi, bạn sẽ thấy một danh sách các sinh viên là phản hồi. Hiện tại, chúng tôi chỉ có một bản ghi trong cơ sở dữ liệu của mình.

Postman IEQHc2RddV Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Tiếp theo, hãy kiểm tra Lambda get-student-by-id. Tôi đã gửi một yêu cầu GET tới <url> / Students / 1. Và đúng như vậy, nó trả về thông tin chi tiết của học sinh với Id 1.

Postman Z6R9hqnoka Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Cuối cùng, hãy tạo một học sinh mới. Đã gửi một yêu cầu POST đến điểm cuối <url> / students cùng với thông tin chi tiết về học sinh. Và phản hồi là Sinh viên của chúng ta được tạo với ID 2!

Postman 7lDzMoDjEr Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Ngoài ra, hãy nhớ rằng chúng tôi đã viết một Logger nhỏ trong Create-Student Lambda của chúng tôi? Hãy điều hướng đến Cloudwatch / Log Groups / create-student và kiểm tra nhật ký.

chrome kBWX1ReSVr Amazon API Gateway với .NET - Tích hợp AWS Lambda & DynamoDB

Bạn có thể thấy rằng thông báo nhật ký của chúng tôi cũng được in ở đây.

Đó là một kết thúc cho bài báo toàn diện này. Trong bài tiếp theo, chúng ta sẽ tìm hiểu về cách bảo mật API Gateway bằng Lambda Authorizer! Hiện tại, cổng API mà chúng tôi đã tạo là một điểm cuối công khai.

MẸO quan trọng: Đảm bảo rằng bạn luôn xóa Tài nguyên AWS mà bạn đã tạo sau khi khám phá xong chúng. Điều này giúp giảm Chi phí phát sinh, mặc dù Bậc MIỄN PHÍ cung cấp cho bạn một lượng khá lớn các yêu cầu MIỄN PHÍ để làm việc.

Bản tóm tắt

Trong bài viết này, chúng ta đã tìm hiểu về cách bắt đầu với Amazon API Gateway với .NET. Ở đây, chúng ta đã tìm hiểu về cách tạo các Lambdas cơ bản tương thích với Amazon API Gateway, tích hợp chúng vào DynamoDB, thêm Nhiều Lambdas vào một Gateway cụ thể, Ghi nhật ký và hơn thế nữa. Điều này sẽ cung cấp cho bạn một ý tưởng vững chắc để làm việc với ứng dụng AWS Serverless. Là phần tiếp theo của ứng dụng AWS Serverless với .NET này, chúng ta sẽ khám phá cách bảo mật Cổng API và làm việc với SAM, v.v. Giữ nguyên. Bạn có thể theo dõi bản tin này để nhận thông báo khi tôi đăng bài mới - https://www.getrevue.co/profile/iammukeshm

Hãy chia sẻ bài viết này với đồng nghiệp và vòng kết nối nhà phát triển của bạn nếu bạn thấy điều này thú vị. Bạn có thể tìm thấy  mã nguồn của dự án  tại đây. Cảm ơn!  

 Nguồn: https://codewithmukesh.com/blog/amazon-api-gateway-with-dotnet/

 #dotnet #amazon #api 

Amazon API Gateway với .NET
顾 静

顾 静

1660047240

带有 .NET 的 Amazon API 网关

在这篇综合文章中,我们将学习使用 .NET 堆栈的 Amazon API Gateway。使用它,我们将能够很容易地将 AWS Lambdas 暴露给外部世界。

在之前的文章中,我们了解了如何使用 .NET 使用 AWS Lambda,这是开始使用无服务器应用程序的关键点。尽管我们在 AWS 上构建并部署了这些 Lambda,但我们从未真正讨论过如何将它们公开以供外部世界调用。

在本综合指南的进一步内容中,我们将构建一个完整的无服务器应用程序,该应用程序在 Amazon API Gateway、Lambda、DynamoDb for Persistence 和 Cloudwatch 之间无缝集成以用于日志记录。

您可以在此处找到实现的源代码

什么是亚马逊 API 网关?

Amazon API Gateway 是一项完全托管的服务,可让您创建网关,它本质上是进入应用程序业务逻辑世界的大门。使用此服务,您基本上可以公开访问连接到 AWS Lambda、公共终端节点和各种其他 AWS 服务的终端节点,具体取决于您构建 Amazon API Gateway 的方式。

假设某些在 Internet 上运行的应用程序需要访问您的 lambda 中的业务逻辑。这些客户端应用程序将连接到 Amazon API Gateway,后者会在内部将请求重定向到关联的 AWS Lambda 或您将配置的其他服务。

让我们看一下通过 API 网关的常见请求流的图示。

带有 .NET 的 Amazon API 网关

如您所见,客户端访问内部连接到服务的网关。例如,

  • www.<url-of-aws-gateway>/test -> 将重定向到名为 test-lambda 的 lambda
  • www.<url-of-aws-gateway>/get-students -> 将重定向到返回学生列表的 lambda
  • www.<url-of-aws-gateway>/weather?city=trivandrum -> 将重定向到公共天气 API 端点,该端点将返回特里凡得琅市的天气数据。

现在,API 网关通常是整个 AWS 无服务器生态系统的重要组成部分,因为它让以任何规模访问我们的 AWS 服务变得非常酷且容易。

AWS REST API 与 HTTP API

AWS 支持两个版本的 API 网关服务。最初的版本是针对 REST API 变体,其中包含大量用于设计、开发和维护 API 网关的功能。后来,在 2019 年左右,AWS 引入了 HTTP API,简化了网关的创建和部署。不要与命名混淆,这两个版本都是基于 REST 约定的 HTTP 协议构建的。AWS 在内部将它们命名为 v1(REST API)和 v2(HTTP API)

这些版本之间存在很多显着差异,包括性能、定价和开发体验。简而言之,HTTP API 在几乎所有部门中都胜出,大多数时候应该是您的选择。

  • 首先,HTTP API 旨在提高性能,与 REST API 相比,性能几乎提高了 10-15%。
  • 在定价方面,对于每月前 3 亿个请求,HTTP API 的成本仅为 1 美元,而对于相同的数量,REST API 的成本约为 3.5 美元。这是一个巨大的差异。请注意,AWS 免费套餐包括前 12 个月每月 100 万个 API(REST 和 HTTP),完全免费。有足够的时间来探索这两种很酷的技术,对吧?
  • AWS 控制台在开发这些网关时提供的用户体验完全不同。
  • REST API 支持边缘优化端点,可确保您的端点在全球范围内高度分布,而 HTTP 端点仅支持区域部署,这可能会导致响应稍有延迟。
  • 这两者本质上都是高度安全的。
  • 如果这对您的部署策略来说意义重大,则金丝雀部署包含在 REST API 中,而不包含在 HTTP API 中。

如需更多比较,请参阅比较这两个版本的AWS 开发人员指南。尽管 HTTP API 比 REST 便宜,但 REST API 中肯定包含很多功能,这证明了价格差异是合理的。

至于我们的演示,我们将使用 HTTP API。也许在以后的文章中,我们将探讨 REST API。从概念上讲,这两者几乎相同。我们将使用 Visual Studio 2022 Community 和 AWS SDK Kit 扩展,就像我们在上一篇关于 Lambda 的文章中所做的那样来开发、测试、模拟并将我们的 Lambda 发布到 AWS 云。

重要的是,您已经阅读了上一篇关于 .NET 上的 AWS Lambda 的文章,其中我们通过 CLI 设置了 AWS 凭证,在 Visual Studio Code 上安装了 AWS Toolkit。如果没有,请参考这篇博文。

使用 .NET 构建和发布 AWS Lambda

首先,让我们打开 Visual Studio 2022 并创建一个空白解决方案。我将我的解决方案命名为AWSServerless.Dotnet.Demo。基本上,我们将有 2 个 Lambda 项目,我们将逐步添加。

  1. 一个返回 Hello 消息的虚拟 Lambda。此 lambda 将用于介绍 Amazon API Gateway 集成基础知识和内容。
  2. 一个学生 Lambda,我们将向其中添加多个函数处理程序,这些处理程序可能对 DynamoDB 执行一些基本的 CRUD 操作。(PS,我写了一篇关于使用 .NET 开始使用 DynamoDB 的文章。请检查一下。)

在继续之前,请确保您已准备好以下各项。

  • 通过 AWS CLI 设置 AWS 凭证。
  • AWS Toolkit 安装在您的 Visual Studio 安装中。
  • 拥有 AWS 账户。免费套餐绰绰有余。

您可以在我之前关于使用 .NET 的 AWS 无服务器应用程序的文章中获得与上述步骤相关的更多信息。

使用 .NET 创建空白项目 aws 无服务器 Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

让我们将我们的第一个 Lambda 项目添加到我们的空白解决方案中。右键单击 Visual Studio 中的解决方案,然后单击添加新项目。假设您已经在 Visual Studio 实例上安装了 AWS Toolkit,您可以在出现的“添加新项目”弹出窗口中搜索 AWS Lambda。

devenv iArkd7DjVv Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

单击下一步。在这里,我们将 lambda 命名为 HelloLambda。如前所述,这将是一个简单的 lambda,它可以帮助我们了解与 .NET 与 Amazon API Gateway 的整个集成是什么样的。当系统提示您为新的 lambda 选择蓝图时,选择“Empty Function”。这为我们提供了一个全新的开始构建我们简单的 Lambda。

您应该已经熟悉 AWS Lambda 项目的文件夹结构。如果没有,请阅读本文。打开 Function.cs / FunctionHandler。现在我们要将这个 Handler 附加到我们的 API 网关中,我们需要对这个方法的签名进行一些微小的修改。但在此之前,让我们为这个包含合约的 Lambda 项目安装一个包。您可以打开包管理器控制台并运行以下命令来安装包。

Install-Package Amazon.Lambda.APIGatewayEvents

现在让我们去改变我们的 FunctionHandler。

public APIGatewayHttpApiV2ProxyResponse FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
request.QueryStringParameters.TryGetValue("name", out var name);
name = name ?? "John Doe";
var message = $"Hello {name}, from AWS Lambda";
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

APIGatewayHttpApiV2ProxyRequest 表示来自 HTTP API 的传入请求。如果您考虑一下,或者如果您回顾我们的第一个流程图,Lambda 收到的请求并不是直接来自客户端,而是来自 Amazon API Gateway 本身的请求。因此,在这种情况下,API 网关使用APIGatewayHttpApiV2ProxyRequest类型向 Lambda 发送请求。同样,APIGatewayHttpApiV2ProxyResponse是 Lambda 返回给 Amazon API Gateway 的响应类型。您也可以跳过此响应部分,而是返回一些关键数据作为业务需求,例如学生列表,我们将在本指南中进一步构建下一个 Lambda 时执行此操作。

所以这些是 Lambda 中支持整个 API 网关集成的主要变化。除此之外,函数处理程序现在返回一条消息,指出“Hello {name},来自 AWS Lambda”。这里的另一件事是,在 Lambda 中,您可以访问传入的上下文,其中包括查询字符串、路径参数、路由等。对于这个 Lambda,我希望传入的请求会有一个名称为 (.../hello?name=Mukesh) 的查询参数,然后将其添加到它最终返回的消息中。

如果查询参数不存在,它会使用默认名称,即 John Doe。请注意,我们以APIGatewayHttpApiV2ProxyResponse 类型返回响应,其中 Body 是实际消息,我们提供状态代码 200 SUCCESS。

这就是我们的第一个 Lambda。让我们将它发布到 AWS 并在 Visual Studio 中本地模拟测试它。右键单击 HelloLambda 项目,然后单击 Publish to AWS Lambda。您将看到以下弹出窗口。

image 带有 .NET 的 Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

假设您已设置本地 AWS 凭证、区域和配置文件,该工具会自动填写前几个详细信息。

  • 函数名称是在您的 AWS 账户中识别 Lambda 的名称。
  • 描述——顾名思义。
  • 处理程序在这里有点重要。假设您的 Function.cs 可能有多个 Handler 方法。此 Handler 方法映射到您需要 Lambda 指向的确切函数。在我们的例子中,它是 HelloLambda::HelloLambda.Function::FunctionHandler。请记住这一点,因为我们将在本文后面使用此字段。

点击下一步。

devenv oEzQI2HY6h Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

在下一个屏幕中,您需要做的唯一更改是选择所需的正确角色。在我们的例子中,它是 AWSLambdaBasicExecutionRole。这带有将日志写入 AWS Cloudwatch 的权限。而已。单击上传。AWS 开始创建所需的角色,运行一些命令以在本地构建和发布您的 Lambda,压缩已发布的库,并将其上传到 AWS,最终创建您的新闪亮 Lambda。

带有 .NET 的 Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

完成后,您可以打开 AWS 管理控制台,导航到 Lambda 并验证我们的新 Lambda 是否已创建。

图 2 带有 .NET 的 Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

回到 Visual Studio,您可以看到发布向导会打开一个小工具,帮助直接从 Visual Studio 测试我们的 Lambda。哦,如果你还不知道,你也可以简单地在调试模式下运行 Lambda 应用程序,Visual Studio 会启动一个 Mock Tool,它基本上可以帮助测试和调试你的 Lambda 代码。

现在,让我们探索 Visual Studio 界面中内置的工具。这是下面的屏幕截图。

图 1 带有 .NET 的 Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

首先,此接口允许您将模拟请求直接发送到已部署到 AWS 的 Lambda。单击示例请求下拉菜单,然后选择 API Gateway AWS 代理。该工具将填写一个示例请求。在这里,和我一样,您可以向查询字符串参数添加名称键/值。这里有很多房产可以摆弄。单击 Invoke 后,响应中将包含我们的消息,状态代码为 200。

现在,虽然 Lambda 已经准备就绪,但除了 VS 调试工具之外,我们真的没有其他方法可以访问此函数。因此,我们需要一个向其发送请求的链接/端点,并且我们期望来自 Lambda 的类似请求返回。这就是 Amazon API Gateway 发挥作用的地方。

使用 .NET 创建 Amazon API 网关

让我们开始设计我们的第一个 Amazon API 网关。在您在 AWS 管理控制台中看到的搜索栏中搜索 API Gateway。您将看到 Amazon API Gateway 的默认登录页面。在这里,您将看到选择 API 类型的选项。由于我们将使用 HTTP API,让我们点击与之关联的 Build 按钮。

chrome HZudzLTStT Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

鉴于我们的 Lambda 已成功创建,您可以选择集成类型为 Lambda 并选择我们的 hello Lambda 函数。确保我们坚持使用有效载荷的 2.0 版,因为它是最新的。此外,请确保选择正确的 AWS 区域。就我而言,它是 ap-south-1。完成后,单击下一步。

带有 .NET 的 chrome ZaswQgDPsT Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

接下来是一个有趣的部分,我们在其中配置可以调用我们的 hello Lambda 的实际路由。您可以看到我已将其设为 GET 方法,该方法的端点为 /hello 并以 Hello Lambda 为目标。所以基本上,一旦我们创建了 API 网关,AWS 就会为我们提供一个端点 URL,如果我们添加一个 /hello 并发送一个带有适当查询参数的 GET 方法将触发 Lambda 并返回预期的响应。

请注意,您可以在此处使用多个路由和集成。我们将在本文后面创建完整的 API 网关时对此进行探讨。

chrome 1j5EYx3xWe Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

接下来,向导将要求我们创建阶段。如果我们想将我们的 Amazon API Gateway 部署到不同的阶段,如开发、生产和登台,这将非常方便。但是现在,让我们将其保留为默认值“$default”,然后单击“下一步”。

您可以在此处查看您的更改并部署您的网关。就是这样,就这么简单。

在下面的屏幕中,您可以看到我们刚刚创建的 Amazon API Gateway 的 URL。复制它并打开 Postman 或您使用的任何 API 测试工具。此外,由于它只是一个 GET 方法,您甚至可以自由地使用浏览器来测试我们的网关。

带有 .NET 的 chrome kmkvkIZHmM Amazon API 网关 - AWS Lambda 和 DynamoDB 集成

让我们测试一下我们的 API 网关将如何响应。我将使用 Postman 进行测试。确保它是一个 GET 方法,否则网关会喊出找不到这样的端点。

在下面的屏幕截图中,您可以看到我向 /hello 端点发送了一个请求,并将查询参数名称作为我的 Name 传递,您还可以看到 Lambda 的预期响应。很简单,对吧?随意摆弄 Hello Lambda 以了解更多信息。

Postman 09XFb6JnKd Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

探索 Amazon API Gateway 控制台界面

现在我们已经创建了第一个使用 .NET 支持的 AWS Lambdas 的 Amazon API Gateway,让我们探索一下 Amazon API Gateway 上提供的接口和功能。

在主页上,您可以看到您在特定 AWS 区域中创建的网关列表。

带有 .NET 的 chrome RYg52eeVpW Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

一旦您进入特定的 API 网关,您就可以访问一系列很酷的功能来调整您的网关。

chrome C3lh3VJBk3 Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

从这里,您可以:

  • 向现有 Amazon API Gateway 添加更多路由。
  • 使用 Lambda 和 JWT 保护 Amazon API Gateway。我们将在下一篇文章中深入探讨!
  • 管理集成和 Lambda。
  • 配置 CORS 策略。
  • 导出/导入 OpenAPI 定义。
  • 如果需要,写入访问日志。因此,每次通过 API 网关发送请求时,该请求都会记录到 Cloudwatch。您必须为此指定一个日志组目标。我们将在本文后面对此进行研究。
  • 管理/创建阶段等等。

现在我们已经基本了解了 Amazon API Gateway 与 .NET 的工作原理,现在让我们构建一个更高级的无服务器应用程序,该应用程序利用 AWS Lambda、多个函数处理程序、Cloudwatch、DynamoDB 存储数据,最后集成所有这些 Lambda 使用 Amazon API 网关。

使用 .NET 构建学生管理 AWS Lambda

我们将构建一个简单的 API,它可以获取所有学生详细信息、通过 ID 获取学生并创建新的学生记录。将一个新的 Lambda 项目添加到我们的解决方案并将其命名为 StudentLambda。是的,我们将从一个 Lambda 项目创建多个 Lambda。您可以自由地为每个功能创建单独的项目。但就目前的应用范围和需求而言,确实没有必要。我们将所有 3 个 Lambda 函数填充到一个 .NET Lambda 项目中,并利用 FunctionHandlers 将所有 Lambda 单独部署到 AWS。

在开始之前,请确保通过包管理器控制台将以下 Nuget 包安装到您的 StudentLambda 项目。

Install-Package Amazon.Lambda.APIGatewayEvents
Install-Package AWSSDK.DynamoDBv2
Install-Package Newtonsoft.Json

如您所知,第一个包专门用于在我们的 .NET Lambda 中使用 Amazon API Gateway 合约。

DynamoDB 包让我们的 Lambda 与我们的 DynamoDB 进行通信。如果您不了解 DynamoDB 的工作原理,我已在此处编写了一份完整的指南。我构建了一个简单的 CRUD ASP.NET Core WebAPI,它将数据存储到 AWS DynamoDB 表中。

接下来,让我们定义学生模型。使用 StudentLambda 项目的根目录,添加一个新类并将其命名为 Student.cs

namespace StudentLambda
{
[DynamoDBTable("students")]
public class Student
{
[DynamoDBHashKey("id")]
public int? Id { get; set; }
[DynamoDBProperty("first_name")]
public string? FirstName { get; set; }
[DynamoDBProperty("last_name")]
public string? LastName { get; set; }
[DynamoDBProperty("class")]
public int Class { get; set; }
}
}

现在导航到 AWS DynamoDB 并在那里创建一个新表,如下所示。

chrome FCz71W3ljT Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

创建表后,AWS 将花费几秒钟时间将表预置到云中。让我们在这个表中添加一个示例记录。打开表格,点击探索表格项目-> 创建项目。

切换到 JSON 视图并添加如下示例记录。请注意,我使用的属性与我们在 Student.cs 类中定义的属性完全相同。单击创建。

{
"id": 1,
"first_name" : "Mukesh",
"last_name" : "Murugan",
"class" : 10
}

带有 .NET 的 chrome MotUEECHAR1 Amazon API 网关 - AWS Lambda 和 DynamoDB 集成

让所有学生

让我们编写一些代码以从 DynamoDB 表中返回所有学生的列表。打开 StudentLambda 的 Function.cs 类。删除默认的 FunctionHandler 方法。并添加以下功能。

public async Task<List<Student>> GetAllStudentsAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
var data = await dbContext.ScanAsync<Student>(default).GetRemainingAsync();
return data;
}

所以这个函数本质上是扫描整个 DynamoDB 表的名字学生并返回一个学生列表。就如此容易。请注意,我们将创建几个 DynamoDB 客户端和上下文来从 AWS Lambda 访问我们的数据。

一旦所有 3 个完成,我们将部署这些 Lambda。理想情况下,此 Lambda 的端点将是 <amazon-url>/students [GET] 方法。

创建学生

接下来,在 Student Lambda 的 Same Function.cs 中,让我们添加另一个负责创建新学生记录的方法。下面是函数。

public async Task<APIGatewayHttpApiV2ProxyResponse> CreateStudentAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
var studentRequest = JsonConvert.DeserializeObject<Student>(request.Body);
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
await dbContext.SaveAsync(studentRequest);
var message = $"Student with Id {studentRequest?.Id} Created";
LambdaLogger.Log(message);
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

因此,在这里我们希望客户端发送一个包含学生详细信息的 JSON 正文。

第 3 行,我们将传入的请求正文反序列化为 Student 对象。然后我们创建一个用于访问 dynamoDb 表的数据库上下文,并将学生记录保存到我们的数据库中。完成后,我们将向客户端返回一条成功消息作为状态码为 200 的响应。

在第 8 行,您可以注意到我们正在使用 LambdaLogger 实例将消息记录到 Lambda 的 Cloudwatch LogGroup。理想情况下,此端点将是 <amazon-url>/students [POST] 方法。

通过 ID 获取学生

继续我们的 Last lambda 函数,让我们添加一个函数,该函数可以根据请求中发送的 ID 返回学生。这将是一个稍微不同的函数,因为我们必须从请求的路径参数中获取 ID。例如,这个部署端点看起来像 <amazon-url>/students/{id}。

Copy 将以下方法粘贴到 Student Lambda 项目的 Function.cs。

public async Task<Student> GetStudentByIdAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
string idFromPath = request.PathParameters["id"];
int id = Int32.Parse(idFromPath);
var student = await dbContext.LoadAsync<Student>(id);
if (student == null) throw new Exception("Not Found!");
return student;
}

在第 5 行中,我们从请求的路径参数属性中提取学生 ID。获取它后,我们将其转换为整数并将其传递给 dynamoDb 方法以通过 Id 获取学生。该学生记录作为响应返回给客户端。

现在,所有的 lamda 函数都创建好了。让我们将它们部署到 AWS。

在 Visual Studio 上,右键单击 StudentLambda 项目,然后单击发布到 AWS Lambda。我们将依次部署这 3 个功能中的每一个。

在下面的屏幕上有 2 点需要注意。函数名称为“get-all-students”,处理程序指向 GetAllStudentsAsync 方法。这就是我们分别发布所有 3 个 Lambda 的方式。你现在一定已经明白了。更改这些字段后,单击下一步。

devenv lP4870ufPw Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

在下一个屏幕中,您需要选择与此 Lambda 关联的角色。对于初学者,它可以是 AWSLambdaBasicExecution 角色。但是,这有一个问题。此特定角色仅提供执行 Lambda 并将日志写入 Cloudwatch 的访问权限。但是没有权限访问我们的 DynamoDB 表,对吧?我们将在部署所有 Lambda 后解决此问题。

devenv k3q9el3o6D Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

就是这样,上传 get-all-students Lambda。

重复类似的步骤来部署剩余的 Lambda。确保为这 2 个 AWS Lambda 中的每一个选择已创建的角色。

devenv 12JZFkHk21 Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

devenv fycfsY0BNP Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

devenv jD6jBn30hv Amazon API Gateway with .NET - AWS Lambda & DynamoDB 集成

而已!这是我们到目前为止创建的 Lambda。

chrome yqXn6ON0rX Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

添加 DynamoDB 权限。

如前所述,让我们将所需的 DynamoDB 权限添加到我们创建的角色中。导航到 AWS IAM。转到策略并使用以下规范创建一个。正如您在此处看到的,我们已选择 DynamoDB 作为 AWS 服务并允许所有 DynamoDB 操作以及所有资源。

chrome Ql3GcGoy6E Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

请注意,向特定角色授予完整权限并不总是一个好主意。但是为了简单起见,我们正在这样做。您不应该为生产应用程序执行此操作。仅授予真正需要的权限。

在下一页上,为策略命名并创建它。

chrome ycODtFF4xn Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

现在我们已经创建了策略,让我们将它附加到我们的角色。从列表中选择新创建的策略,然后单击附加。在下一页上,您必须选择要将此策略附加到的角色/用户/组。

chrome BXL706oAoM Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

在我们的例子中,它是 lambda_exec_get-all-students

带有 .NET 的 chrome mAu7ftXH2A Amazon API 网关 - AWS Lambda 和 DynamoDB 集成

你去吧。我们已成功地将策略​​附加到我们的 AWS Lambda 使用的角色。现在 Lambda 应该有足够的权限来使用 DynamoDb。

使用 .NET AWS Lambda 连接 Amazon API Gateway

接下来是指南的关键部分,实际构建一个触发每个 lambdas 的 API 网关。从 AWS 管理控制台打开 Amazon API Gateway。

到目前为止,我们只创建了一个 API Gateway,它是hello。创建一个新的 API 网关。像往常一样,选择 HTTP API 类型并点击 Build。

我们将网关命名为学生,并将所有 3 个 Lambda 都添加为集成。很简单,对吧?

带有 .NET 的 chrome j6Rwc9eHTU Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

在下一页中,我们将配置我们的路线。我们将更改默认值并添加以下配置。

chrome HTdaHTJd1a Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

  • GET /students 将调用 get-all-students
  • GET /students/{id} 将调用 get-student-by-id ,其中 id 是请求的路径参数。例如,/学生/1
  • 最后,POST /students 将创建一个新学生,因为我们已将新学生的详细信息作为请求的 JSON 有效负载传递。
     

将阶段保留为默认值并继续创建网关。

带有 .NET 的 chrome b5Pqmem97h Amazon API Gateway - AWS Lambda 和 DynamoDB 集成

给你,就是这样。让我们用 Postman 测试这个端点。

首先,我正在测试 get-al-students Lambda。我向 <url>/students 发送了一个 GET 请求。正如预期的那样,您会看到一个学生列表作为响应。目前,我们的数据库中只有一条记录。

Postman IEQHc2RddV Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

接下来,让我们测试 get-student-by-id Lambda。我向 <url>/students/1 发送了一个 GET 请求。它正确地返回了 ID 为 1 的学生的详细信息。

Postman Z6R9hqnoka Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

最后,让我们创建一个新学生。向 <url>/students 端点发送 POST 请求以及学生详细信息。响应是我们的学生是用 ID 2 创建的!

Postman 7lDzMoDjEr Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

另外,还记得我们在 Create-Student Lambda 中编写了一个小型 Logger 吗?让我们导航到 Cloudwatch / Log Groups / create-student 并检查日志。

chrome kBWX1ReSVr Amazon API Gateway with .NET - AWS Lambda 和 DynamoDB 集成

您可以看到我们的日志消息也打印在这里。

这是这篇综合文章的总结。在下一篇文章中,我们将学习如何使用 Lambda Authorizer 保护 API 网关!目前,我们创建的 API 网关是一个公共端点。

重要提示:确保在完成探索后始终删除您创建的 AWS 资源。这有助于减少产生的成本,尽管免费层为您提供了相当数量的免费请求。

概括

在本文中,我们了解了如何使用 .NET 开始使用 Amazon API Gateway。在这里,我们了解了如何创建与 Amazon API Gateway 兼容的基本 Lambda、将它们集成到 DynamoDB、将多个 Lambda 添加到特定网关、日志记录等等。这将为您提供使用 AWS 无服务器应用程序的可靠思路。作为这个带有 .NET 的 AWS 无服务器应用程序的下一部分,我们将探索如何保护 API 网关,以及如何使用 SAM 等等。敬请关注。当我发布新文章时,您可以关注此时事通讯以获取通知 – https://www.getrevue.co/profile/iammukeshm

如果您觉得这篇文章很有趣,请与您的同事和开发人员圈子分享这篇文章。你可以在这里找到 项目的源代码 。谢谢!  

 来源:https ://codewithmukesh.com/blog/amazon-api-gateway-with-dotnet/

#dotnet #amazon #api 

带有 .NET 的 Amazon API 网关
Rui  Silva

Rui Silva

1660047138

Amazon API Gateway com .NET

Neste artigo abrangente, aprenderemos o Amazon API Gateway com pilha .NET. Usando isso, poderemos expor o AWS Lambdas ao mundo externo com bastante facilidade.

Em um artigo anterior, aprendemos sobre como trabalhar com o AWS Lambda usando .NET, que é um ponto vital para começar a usar aplicativos Serverless. Embora tenhamos construído e implantado esses Lambdas na AWS, nunca discutimos como iríamos expô-los para serem invocados pelo mundo externo.

Mais adiante neste guia abrangente, construiremos um aplicativo sem servidor completo que se integra perfeitamente entre Amazon API Gateway, Lambda, DynamoDb for Persistence e Cloudwatch para fins de registro.

Você pode encontrar o código-fonte da implementação aqui .

O que é o Amazon API Gateway?

O Amazon API Gateway é um serviço totalmente gerenciado que permite criar Gateways, que servem essencialmente como uma porta para o mundo da lógica de negócios do seu aplicativo. Com esse serviço, você basicamente expõe endpoints que, ao acessar, se conectam ao AWS Lambdas, endpoints públicos e vários outros serviços da AWS, dependendo da maneira como você cria o Amazon API Gateway.

Digamos que algum aplicativo executado na Internet precise de acesso à lógica de negócios que permanece em seu lambda. Esses aplicativos cliente se conectariam ao Amazon API Gateway, que redirecionaria internamente a solicitação para o AWS Lambda associado ou outros serviços que você configurou.

Vejamos uma representação esquemática de como seria um fluxo de solicitação comum por meio de um API Gateway.

Amazon API Gateway com .NET

Como você pode ver, os clientes acessam o Gateway que está conectado internamente a um serviço. Por exemplo,

  • www.<url-of-aws-gateway>/test -> redirecionaria para um lambda chamado test-lambda
  • www.<url-of-aws-gateway>/get-students -> redirecionaria para um lambda que retorna a lista de alunos
  • www.<url-of-aws-gateway>/weather?city=trivandrum -> redirecionaria para um endpoint de API de clima público que retornaria os dados meteorológicos da cidade de Trivandrum.

Agora, os API Gateways costumam ser uma parte vital de todo o ecossistema AWS Serverless, pois torna muito legal e fácil acessar nossos serviços da AWS em qualquer escala.

API REST da AWS vs API HTTP

A AWS oferece suporte a duas versões dos serviços do API Gateway. A versão inicial foi para a variante da API REST, que inclui vários recursos para projetar, desenvolver e manter seu API Gateway. Mais tarde, por volta de 2019, a AWS apresenta APIs HTTP que simplificaram a criação e a implantação do Gateway. Não se confunda com a nomenclatura, ambas as versões são construídas no protocolo HTTP seguindo as convenções REST. Internamente, a AWS os nomeia como v1 (API REST) ​​e v2 (API HTTP)

Existem muitas diferenças significativas entre essas versões, incluindo desempenho, preço e experiência de desenvolvimento. Resumindo, HTTP Apis vence em quase todos os departamentos e deve ser sua escolha na maioria das vezes.

  • Em primeiro lugar, as APIs HTTP devem ter melhor desempenho e são quase 10-15% mais eficientes em comparação com a API REST.
  • Em termos de preço, para os primeiros 300 milhões de solicitações por mês, as APIs HTTP custariam apenas US$ 1, enquanto, para o mesmo volume, as APIs REST custam cerca de US$ 3,5. Isso é uma grande diferença. Observe que o nível gratuito da AWS inclui 1 milhão de API (REST e HTTP) por mês durante os primeiros 12 meses absolutamente grátis. Tempo suficiente para explorar essas duas tecnologias legais, certo?
  • A experiência do usuário oferecida pelo console da AWS durante o desenvolvimento desses gateways é completamente diferente uma da outra.
  • A API REST oferece suporte a endpoints otimizados para bordas que garantem que seus endpoints sejam altamente distribuídos em todo o mundo, enquanto endpoints HTTP oferecem suporte apenas a implantações regionais, o que pode contribuir para um pequeno atraso nas respostas.
  • Ambos são altamente seguros por natureza.
  • As implantações canary estão incluídas na API REST e não nas APIs HTTP se isso for um grande negócio para sua estratégia de implantação.

Para obter mais comparações, consulte o guia do desenvolvedor da AWS que compara essas duas versões. Embora as APIs HTTP sejam mais baratas que REST, certamente há muitos recursos incluídos na API REST que justificam a diferença de preço.

Quanto à nossa demonstração, usaremos APIs HTTP. Talvez em um artigo posterior, exploraremos as APIs REST. Em termos de conceito, ambos são quase os mesmos. Usaremos o Visual Studio 2022 Community juntamente com a extensão AWS SDK Kit, como fizemos no artigo anterior sobre Lambda para desenvolver, testar, simular e publicar nossos Lambdas na Nuvem AWS.

É importante que você já tenha lido o artigo anterior sobre AWS Lambda em .NET, onde configuramos as credenciais da AWS por meio da CLI, Instalamos o AWS Toolkit no Visual Studio Code. Se não, consulte esta postagem do blog.

Criando e publicando um AWS Lambda com .NET

Primeiro, vamos abrir o Visual Studio 2022 e criar uma solução em branco. Eu nomeei minha solução como AWSServerless.Dotnet.Demo . Basicamente, teremos 2 projetos Lambda neste, que adicionaremos gradualmente.

  1. Um Lambda fictício que retorna uma mensagem Hello. Este lambda será usado para apresentar noções básicas de integração do Amazon API Gateway e outras coisas.
  2. Um Student Lambda, ao qual adicionaremos vários manipuladores de função que podem executar algumas operações CRUD básicas no DynamoDB. (PS, escrevi um artigo sobre Introdução ao DynamoDB usando .NET. Confira também.)

Antes de continuar, verifique se você já tem o seguinte em vigor.

  • Configuração de credenciais da AWS por meio da AWS CLI.
  • AWS Toolkit instalado em sua instalação do Visual Studio.
  • Tenha uma conta AWS. Um nível gratuito seria mais do que suficiente.

Você pode obter mais informações relacionadas às etapas acima em meus artigos anteriores sobre AWS Serverless Applications com .NET.

criar projeto em branco aws sem servidor Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Vamos adicionar nosso primeiro projeto Lambda à nossa Solução em Branco. Clique com o botão direito do mouse na solução no Visual Studio e clique em Adicionar novo projeto. Supondo que você já tenha instalado o AWS Toolkit em sua instância do Visual Studio, você pode pesquisar AWS Lambda no pop-up 'Adicionar um novo projeto' que aparece.

devenv iArkd7DjVv Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Clique em Avançar. Aqui vamos nomear o lambda HelloLambda. Conforme mencionado anteriormente, este será um lambda simples que nos ajudaria a entender como seria toda a integração com o Amazon API Gateway com .NET. Quando você for solicitado a selecionar um blueprint para seu novo lambda, selecione 'Empty Function'. Isso nos dá uma folha limpa para começar a construir nosso Lambda simples.

Você já deve estar familiarizado com a estrutura de pastas do AWS Lambda Project. Se não, passe por este artigo. Abra o Function.cs / FunctionHandler. Agora que vamos anexar esse Handler ao nosso API Gateway, precisamos fazer algumas pequenas modificações na assinatura desse método. Mas antes disso vamos instalar um pacote para este projeto Lambda que contém os contratos. Você pode abrir o Console do Gerenciador de Pacotes e executar o seguinte para instalar o pacote.

Install-Package Amazon.Lambda.APIGatewayEvents

Vamos mudar nosso FunctionHandler agora.

public APIGatewayHttpApiV2ProxyResponse FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
request.QueryStringParameters.TryGetValue("name", out var name);
name = name ?? "John Doe";
var message = $"Hello {name}, from AWS Lambda";
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

APIGatewayHttpApiV2ProxyRequest representa a solicitação recebida de uma API HTTP. Se você pensar sobre isso, ou se você olhar para o primeiro diagrama de fluxo que tivemos, a solicitação que o Lambda recebe não é diretamente do cliente, mas uma solicitação do próprio Amazon API Gateway. Portanto, nesse caso, o API Gateway envia uma solicitação ao Lambda com o tipo APIGatewayHttpApiV2ProxyRequest . Da mesma forma, APIGatewayHttpApiV2ProxyResponse é o tipo de resposta que o Lambda devolve ao Amazon API Gateway. Você também pode pular esta parte de resposta e, em vez disso, retornar alguns dados cruciais como o requisito de negócios, como uma lista de alunos, o que faremos enquanto construímos nosso próximo Lambda neste guia.

Então, essas foram as principais mudanças no Lambda para dar suporte a toda a integração do API Gateway. Além disso, o manipulador de funções agora retorna uma mensagem que diz “Hello {name}, from AWS Lambda”. Outra coisa aqui é que, de dentro do Lambda, você acessa o contexto de entrada, que inclui Query Strings, Path Parameters, Routes e assim por diante. Para este Lambda, espero que a solicitação de entrada tenha um parâmetro de consulta de nome (…/hello?name=Mukesh), que será adicionado à mensagem que finalmente retornar.

Se o Query Parameter não existir, ele avança com o nome padrão, que é John Doe. Observe que estamos retornando a resposta como tipo APIGatewayHttpApiV2ProxyResponse, onde Body é a mensagem real e fornecemos um código de status de 200 SUCCESS.

É isso para o nosso Primeiro Lambda. Vamos publicá-lo na AWS e fazer um teste simulado localmente no Visual Studio. Clique com o botão direito do mouse no projeto HelloLambda e clique em Publicar no AWS Lambda. Você verá o seguinte pop-up.

image Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Os primeiros detalhes são preenchidos automaticamente pela ferramenta, desde que você tenha configurado suas credenciais, região e perfil locais da AWS.

  • O nome da função é o nome com o qual o Lambda será identificado em sua conta da AWS.
  • Descrição – como o nome sugere.
  • Handler é meio importante aqui. Digamos que seu Function.cs possa potencialmente ter vários métodos Handler. Esse método do manipulador mapeia para a função exata para a qual você precisa que o Lambda aponte. No nosso caso, é HelloLambda::HelloLambda.Function::FunctionHandler. Tenha isso em mente, pois usaremos esse campo mais adiante em nosso artigo.

Clique em Avançar.

devenv oEzQI2HY6h Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Na próxima tela, a única alteração que você terá que fazer é selecionar a função correta necessária. No nosso caso, é o AWSLambdaBasicExecutionRole. Isso vem com permissões para gravar logs no AWS Cloudwatch. É isso. Clique em Carregar. A AWS começa a criar as funções necessárias, executa alguns comandos para compilar e liberar seu Lambda localmente, compacta as bibliotecas publicadas e faz o upload para a AWS, que finalmente cria seu novo Lambda brilhante.

Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Uma vez feito, você pode abrir o AWS Management Console, navegar até Lambdas e verificar se nosso novo Lambda foi criado.

image 2 Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

De volta ao Visual Studio, você pode ver que o Publish Wizard teria aberto uma pequena ferramenta que ajuda a testar nosso Lambda Straight do Visual Studio. Ah, e se você ainda não estiver ciente, você também pode simplesmente executar o aplicativo Lambda no modo de depuração e o Visual Studio acionaria uma ferramenta de simulação que essencialmente ajuda a testar e depurar seu código Lambda.

Por enquanto, vamos explorar a ferramenta incorporada à interface do Visual Studio. Aqui está uma captura de tela abaixo.

image 1 Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Primeiro, essa interface permite enviar solicitações simuladas diretamente para o Lambda que foi implantado na AWS. Clique na lista suspensa Example Request e selecione API Gateway AWS Proxy. A ferramenta preencheria uma solicitação de amostra. Aqui, como eu fiz, você pode adicionar uma chave/valor de nome aos parâmetros da string de consulta. Há um monte de propriedades para mexer por aqui. Depois de clicar em Invoke, a resposta terá nossa mensagem com um código de status de 200.

Agora, embora o Lambda esteja pronto, realmente não temos como acessar essa função a não ser pelas ferramentas de depuração do VS. Portanto, precisamos de um link/endpoint para o qual enviamos uma solicitação e esperamos uma solicitação semelhante de volta do Lambda. É aí que o Amazon API Gateway entra em cena.

Criando o Amazon API Gateway com .NET

Vamos começar a projetar nosso primeiro Amazon API Gateway. Pesquise o API Gateway na barra de pesquisa que você vê no Console de gerenciamento da AWS. Você verá a página de destino padrão do Amazon API Gateway. Aqui você verá opções para selecionar um tipo de API. Como usaremos a API HTTP, vamos clicar no botão Build associado a ela.

chrome HZudzLTStT Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Dado que nosso Lambda foi criado com sucesso, você pode selecionar o tipo de integração como Lambda e escolher nossa função hello Lambda. Certifique-se de manter a versão 2.0 da carga útil, pois é a mais recente. Além disso, certifique-se de selecionar a região correta da AWS. No meu caso é ap-south-1. Feito isso, clique em próximo.

chrome ZaswQgDPsT Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Em seguida vem uma parte interessante, onde configuramos as rotas reais que podem invocar nosso hello Lambda. Você pode ver que eu fiz um método GET que terá um endpoint de /hello e terá como alvo o Hello Lambda. Então, basicamente, assim que criamos o API Gateway, a AWS nos forneceria um Endpoint URL, ao qual, se adicionarmos um /hello e enviarmos um método GET com os parâmetros de consulta apropriados, acionará o Lambda e retornará a resposta pretendida.

Observe que você pode várias rotas e integrações aqui. Exploraremos isso quando criarmos nosso gateway de API completo mais adiante neste artigo.

chrome 1j5EYx3xWe Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Em seguida, o Assistente nos pedirá para criar estágios. Isso será útil se quisermos implantar nosso Amazon API Gateway em diferentes estágios, como dev, prod e staging. Mas por enquanto, vamos mantê-lo como o valor padrão que é `$default`, e clique em Next.

Aqui você pode revisar suas alterações e implantar seu gateway. É isso, simples assim.

Na tela abaixo, você pode ver o URL do Amazon API Gateway que acabamos de criar. Copie isso e abra o Postman ou qualquer ferramenta de teste de API que você use. Além disso, como é apenas um método GET, você pode até usar o navegador para testar nosso Gateway.

chrome kmkvkIZHmM Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Vamos testar como nosso API Gateway responderia. Vou usar o Postman para testes. Certifique-se de que é um método GET, senão o Gateway irá gritar que tal ponto final não foi encontrado.

Na captura de tela abaixo, você pode ver que enviei uma solicitação para o endpoint /hello e passei o nome do parâmetro de consulta como meu nome, e você também pode ver a resposta esperada do Lambda. Bem simples, certo? Sinta-se à vontade para brincar com o Hello Lambda para entender mais sobre ele.

Postman 09XFb6JnKd Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Explorando a interface do console do Amazon API Gateway

Agora que criamos nosso primeiro Amazon API Gateway com AWS Lambdas com tecnologia .NET, vamos explorar a interface e os recursos fornecidos no Amazon API Gateway.

Na página inicial, você vê uma lista de gateways criados por você em uma região específica da AWS.

chrome RYg52eeVpW Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Depois de entrar em um API Gateway específico, você obtém acesso a vários recursos interessantes para ajustar seu Gateway.

Chrome C3lh3VJBk3 Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

A partir daqui, você chega a:

  • Adicione mais rotas a um Amazon API Gateway existente.
  • Protegendo o Amazon API Gateway usando Lambdas e JWTs. Vamos nos aprofundar nisso no próximo artigo!
  • Gerenciar integrações e lambdas.
  • Configurar políticas CORS.
  • Exportar/importar definições OpenAPI.
  • Grave logs de acesso, se necessário. Assim, toda vez que há uma solicitação enviada pelo gateway da API, a solicitação é registrada no Cloudwatch. Você terá que especificar um destino do Grupo de logs para isso. Veremos isso mais adiante no artigo.
  • Gerenciar / Criar Estágios e assim por diante.

Agora que temos um entendimento básico de como o Amazon API Gateway com .NET funciona, vamos agora construir um aplicativo Serverless mais avançado que usa AWS Lambda, vários manipuladores de funções, Cloudwatch, DynamoDB para armazenar dados e, finalmente, integrar todos os esses Lambdas usando um Amazon API Gateway.

Criação de gerenciamento de alunos AWS Lambda com .NET

Estaremos construindo uma API simples que pode obter todos os detalhes do aluno, obter o aluno por ID e criar um novo registro de aluno. Adicione um novo projeto Lambda à nossa solução e nomeie-o como StudentLambda. E sim, estaremos criando vários Lambdas a partir de um único projeto Lambda. Você é livre para criar projetos separados para cada uma das funções. Mas para o escopo atual do aplicativo e do requisito, não é realmente necessário. Colocaremos todas as 3 funções do Lambda em um único projeto .NET Lambda e usaremos FunctionHandlers para implantar separadamente todos os Lambdas na AWS.

Antes de começar, certifique-se de instalar os seguintes pacotes Nuget em seu projeto StudentLambda por meio do Console do Gerenciador de Pacotes.

Install-Package Amazon.Lambda.APIGatewayEvents
Install-Package AWSSDK.DynamoDBv2
Install-Package Newtonsoft.Json

Como você sabe, o primeiro pacote é especificamente para usar os contratos do Amazon API Gateway em nosso .NET Lambda.

O pacote DynamoDB permite que nosso Lambda se comunique com nosso DynamoDB. Se você não sabe como o DynamoDB funciona, escrevi um guia completo sobre isso aqui . Eu criei uma WebAPI CRUD ASP.NET Core simples que armazena dados em uma tabela do AWS DynamoDB.

Em seguida, vamos definir o Modelo do Aluno. Com a raiz do projeto StudentLambda, adicione uma nova classe e nomeie-a como Student.cs

namespace StudentLambda
{
[DynamoDBTable("students")]
public class Student
{
[DynamoDBHashKey("id")]
public int? Id { get; set; }
[DynamoDBProperty("first_name")]
public string? FirstName { get; set; }
[DynamoDBProperty("last_name")]
public string? LastName { get; set; }
[DynamoDBProperty("class")]
public int Class { get; set; }
}
}

Agora navegue até o AWS DynamoDB e crie uma nova tabela como a seguinte.

Chrome FCz71W3ljT Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Depois de criar a tabela, a AWS levará alguns segundos para provisionar a tabela na nuvem. Vamos adicionar um registro de amostra a esta tabela. Abra a Tabela, clique em Explorar Itens da Tabela -> Criar Item.

Alterne para a visualização JSON e adicione um registro de amostra como o seguinte. Observe que as propriedades que usei são exatamente as mesmas que definimos em nossa classe Student.cs. Clique em Criar.

{
"id": 1,
"first_name" : "Mukesh",
"last_name" : "Murugan",
"class" : 10
}

Chrome MotUEEQAR1 Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Obtendo todos os alunos

Vamos escrever algum código para retornar uma lista de todos os alunos da tabela do DynamoDB. Abra a classe Function.cs do StudentLambda. Remova o método FunctionHandler padrão. e adicione a seguinte função.

public async Task<List<Student>> GetAllStudentsAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
var data = await dbContext.ScanAsync<Student>(default).GetRemainingAsync();
return data;
}

Portanto, essa função verifica essencialmente toda a tabela do DynamoDB com nomes de alunos e retorna uma lista de alunos. Tão simples como isso. Observe que criaremos alguns DynamoDB Client e Context para acessar nossos dados do AWS Lambda.

Estaremos implantando esses Lambdas assim que todos os 3 estiverem concluídos. Idealmente, o endpoint para este Lambda será <amazon-url>/ Students [GET] Method.

Criar aluno

Em seguida, ao Same Function.cs do Student Lambda, vamos adicionar outro método que será responsável por criar novos registros de alunos. Abaixo está a função.

public async Task<APIGatewayHttpApiV2ProxyResponse> CreateStudentAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
var studentRequest = JsonConvert.DeserializeObject<Student>(request.Body);
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
await dbContext.SaveAsync(studentRequest);
var message = $"Student with Id {studentRequest?.Id} Created";
LambdaLogger.Log(message);
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

Então, aqui esperamos que o cliente envie um corpo JSON com detalhes do aluno.

Linha #3, desserializamos o corpo da solicitação recebida em um objeto Student. Em seguida, criamos um contexto de banco de dados para acessar a tabela dynamoDb e salvamos o registro do aluno em nosso banco de dados. Feito isso, retornaremos uma mensagem de sucesso ao cliente como resposta com um código de status de 200.

Na linha #8 você pode notar que estamos usando uma instância do LambdaLogger para registrar a mensagem no Cloudwatch LogGroup do Lambda. Esse ponto de extremidade será, idealmente, o método <amazon-url>/students [POST].

Obter Aluno por ID

Avançando para nossa última função lambda, vamos adicionar uma função que pode retornar alunos com base no ID enviado na solicitação. Esta será uma função um pouco diferente, pois teremos que buscar o ID do parâmetro Path da solicitação. Por exemplo, esse endpoint de implantação se pareceria com <amazon-url>/students/{id}.

Copiar Cole o seguinte método em Function.cs do projeto Student Lambda.

public async Task<Student> GetStudentByIdAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
string idFromPath = request.PathParameters["id"];
int id = Int32.Parse(idFromPath);
var student = await dbContext.LoadAsync<Student>(id);
if (student == null) throw new Exception("Not Found!");
return student;
}

In-Line #5, estamos extraindo o Student-id da propriedade path parameters da solicitação. Depois de buscá-lo, convertemos para um inteiro e o passamos para o método dynamoDb para obter o aluno por Id. Este registro do aluno é devolvido ao cliente como resposta.

Agora, todas as funções do Lamda são criadas. Vamos implantá-los na AWS.

No Visual Studio, clique com o botão direito do mouse no projeto StudentLambda e clique em Publish to AWS Lambda. Vamos implantar cada uma das 3 funções, uma após a outra.

Há 2 pontos a serem observados na tela abaixo. O nome da função é 'get-all-students' e o manipulador aponta para o método GetAllStudentsAsync. É assim que publicamos separadamente todos os 3 Lambda. Você já deve ter entendido a ideia. Após a alteração desses campos, clique em Avançar.

devenv lP4870ufPw Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Na próxima tela, você precisará selecionar a função associada a este Lambda. Para iniciantes, pode ser a função AWSLambdaBasicExecution. No entanto, há um problema com isso. Essa função específica fornece acesso apenas para executar o Lambda e gravar os logs no Cloudwatch. Mas não há permissão para acessar nossa tabela do DynamoDB, certo? Corrigiremos isso depois de implantar todos os Lambdas.

devenv k3q9el3o6D Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

É isso, faça o upload do Lambda get-all-students.

Repita etapas semelhantes para implantar os Lambdas restantes. Certifique-se de escolher a função já criada para cada um desses 2 AWS Lambda.

devenv 12JZFkHk21 Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

devenv fycfsY0BNP Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

devenv jD6jBn30hv Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

É isso! Aqui estão os Lambdas que criamos até agora.

chrome yqXn6ON0rX Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Adicionando permissões do DynamoDB.

Conforme mencionado, vamos adicionar as permissões necessárias do DynamoDB à função que criamos. Navegue até o AWS IAM. Vá para Políticas e crie uma com a seguinte especificação. Como você vê aqui, selecionamos o DynamoDB como o serviço da AWS e permitimos todas as ações do DynamoDB, bem como todos os recursos.

Chrome Ql3GcGoy6E Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Observe que nem sempre é uma boa ideia conceder permissões completas a uma função específica. Mas para manter as coisas simples, estamos fazendo isso. Você não deve fazer isso para aplicativos de produção. Dê apenas as permissões que são realmente necessárias.

Na próxima página, dê um nome à política e crie-a.

chrome ycODtFF4xn Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Agora que criamos a política, vamos anexá-la às nossas funções. Selecione a política recém-criada na lista e clique em anexar. Na próxima página, você terá que selecionar a função/usuário/grupo ao qual deseja anexar esta política.

Chrome BXL706oAoM Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

No nosso caso, é lambda_exec_get-all-students

chrome mAu7ftXH2A Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Ai está. Anexamos com êxito a política à função usada por nosso AWS Lambda. Agora o Lambda deve ter permissões suficientes para trabalhar com o DynamoDb.

Conectando o Amazon API Gateway com .NET AWS Lambda

Em seguida, vem a parte crucial do guia, para realmente criar um API Gateway que acione cada um desses lambdas. Abra o Amazon API Gateway no Console de gerenciamento da AWS.

Até agora, criamos apenas um API Gateway que é hello . Crie um novo gateway de API. Como de costume, selecione o tipo de API HTTP e clique em Build.

Nomeamos nosso Gateway como alunos e adicionamos todos os 3 Lambdas como Integrações. Simples, certo?

chrome j6Rwc9eHTU Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Na próxima página, estaremos configurando nossas rotas. Estaremos alterando os valores padrão e adicionando a configuração abaixo.

chrome HTdaHTJd1a Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

  • GET /students invocaria o get-all-students
  • GET /students/{id} invocaria o get-student-by-id onde id é o parâmetro de caminho da solicitação. Por exemplo, /alunos/1
  • Por fim, o POST /students criaria um novo aluno, já que passamos os detalhes do novo aluno como uma carga JSON da solicitação.
     

Deixe o estágio como padrão e continue a criar o Gateway.

chrome b5Pqmem97h Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Pronto, é isso. Vamos testar esse endpoint com o Postman.

Em primeiro lugar, estou testando o Lambda get-al-students. Enviei uma solicitação GET para <url>/students. Como esperado, você verá uma lista de alunos como resposta. Por enquanto, temos apenas um registro em nosso banco de dados.

Postman IEQHc2RddV Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Em seguida, vamos testar o Lambda get-student-by-id. Enviei uma solicitação GET para o <url>/students/1. E com razão ele retorna os detalhes do aluno com Id 1.

Postman Z6R9hqnoka Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Finalmente, vamos criar um novo aluno. Enviou uma solicitação POST para o endpoint <url>/students junto com os detalhes do aluno. E a resposta é que nosso Aluno é criado com ID 2!

Postman 7lDzMoDjEr Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Além disso, lembre-se que escrevemos um pequeno Logger em nosso Create-Student Lambda? Vamos navegar até Cloudwatch / Log Groups / create-student e verificar os logs.

chrome kBWX1ReSVr Amazon API Gateway com .NET - Integrações AWS Lambda e DynamoDB

Você pode ver que nossa mensagem de log também é impressa aqui.

Isso é um encerramento para este artigo abrangente. No próximo artigo, aprenderemos sobre como proteger o API Gateway com o Lambda Authorizer! Por enquanto, o gateway de API que criamos é um endpoint público.

DICA importante: Certifique-se de sempre excluir os recursos da AWS que você criou quando terminar de explorá-los. Isso ajuda a reduzir os custos incorridos, embora o nível GRATUITO forneça uma quantidade bastante decente de solicitações GRATUITAS para trabalhar.

Resumo

Neste artigo, aprendemos sobre os primeiros passos com o Amazon API Gateway com .NET. Aqui aprendemos sobre a criação de Lambdas básicos que são compatíveis com o Amazon API Gateway, integrando-os ao DynamoDB, adicionando vários Lambdas a um gateway específico, Logging e muito mais. Isso lhe dará uma ideia sólida para trabalhar com o aplicativo AWS Serverless. Como a próxima parte deste aplicativo AWS Serverless com .NET, exploraremos como proteger os API Gateways, trabalhar com SAM e muito mais. Fique ligado. Você pode seguir este boletim informativo para receber notificações quando eu publicar novos artigos – https://www.getrevue.co/profile/iammukeshm

Compartilhe este artigo com seus colegas e círculos de desenvolvedores se você achou isso interessante. Você pode encontrar o  código-fonte do projeto  aqui. Obrigado!  

 Fonte: https://codewithmukesh.com/blog/amazon-api-gateway-with-dotnet/

#dotnet #amazon #api 

Amazon API Gateway com .NET

Pasarela API de Amazon con .NET

En este artículo completo, aprenderemos sobre Amazon API Gateway con la pila .NET. Con esto, podremos exponer AWS Lambdas al mundo exterior con bastante facilidad.

En un artículo anterior, aprendimos sobre cómo trabajar con AWS Lambda usando .NET, que es un punto vital para comenzar con las aplicaciones sin servidor. Si bien construimos e implementamos esos Lambdas en AWS, en realidad nunca discutimos cómo los expondríamos para que los invoque el mundo externo.

Más adelante en esta guía completa, crearemos una aplicación sin servidor completa que se integre a la perfección entre Amazon API Gateway, Lambda, DynamoDb para persistencia y Cloudwatch para fines de registro.

Puede encontrar el código fuente de la implementación aquí .

¿Qué es la puerta de enlace API de Amazon?

Amazon API Gateway es un servicio completamente administrado que le permite crear puertas de enlace, que esencialmente sirven como una puerta a su mundo de lógica comercial para su aplicación. Con este servicio, básicamente expone puntos finales que, al acceder, se conectan a AWS Lambdas, puntos finales públicos y varios otros servicios de AWS, según la forma en que cree Amazon API Gateway.

Digamos que alguna aplicación que se ejecuta en Internet necesita acceso a la lógica comercial que permanece dentro de su lambda. Estas aplicaciones cliente se conectarían a Amazon API Gateway, que internamente redirigiría la solicitud al AWS Lambda asociado u otros servicios que hubiera configurado.

Veamos una representación esquemática de cómo se vería un flujo de solicitud común a través de una API Gateway.

Pasarela API de Amazon con .NET

Como puede ver, los clientes acceden a la puerta de enlace que está conectada internamente a un servicio. Por ejemplo,

  • www.<url-of-aws-gateway>/test -> redirigiría a una lambda llamada test-lambda
  • www.<url-of-aws-gateway>/get-students -> redirigiría a una lambda que devuelve la lista de estudiantes
  • www.<url-of-aws-gateway>/weather?city=trivandrum -> redirigiría a un punto final de la API meteorológica pública que devolvería los datos meteorológicos de la ciudad de Trivandrum.

Ahora, API Gateways es a menudo una parte vital de todo el ecosistema sin servidor de AWS, ya que hace que sea genial y fácil acceder a nuestros servicios de AWS a cualquier escala.

API REST de AWS frente a API HTTP

AWS admite dos versiones de API Gateway Services. El lanzamiento inicial fue para la variante API REST que incluye toneladas de características para diseñar, desarrollar y mantener su puerta de enlace API. Más tarde, alrededor de 2019, AWS presenta las API HTTP que simplificaron la creación e implementación de Gateway. No se confunda con el nombre, ambas versiones se basan en el protocolo HTTP siguiendo las convenciones REST. AWS los nombra internamente como v1 (API REST) ​​y v2 (API HTTP)

Existen muchas diferencias significativas entre estas versiones, incluido el rendimiento, el precio y la experiencia de desarrollo. En resumen, HTTP Apis gana en casi todos los departamentos y debería ser su elección la mayor parte del tiempo.

  • En primer lugar, las API HTTP están destinadas a tener un mejor rendimiento y son casi un 10-15 % más eficaces en comparación con la API REST.
  • En términos de precios, para los primeros 300 millones de solicitudes por mes, las API HTTP le costarían solo 1 USD, mientras que, para el mismo volumen, las API REST costarían alrededor de 3,5 USD. Esta es una gran diferencia. Tenga en cuenta que la capa gratuita de AWS incluye 1 millón de API (REST y HTTP) por mes durante los primeros 12 meses absolutamente gratis. Tiempo suficiente para explorar estas dos tecnologías geniales, ¿verdad?
  • La experiencia de usuario que ofrece la consola de AWS al desarrollar estas puertas de enlace es completamente diferente entre sí.
  • La API REST admite puntos finales optimizados para el perímetro que garantizan que sus puntos finales estén altamente distribuidos en todo el mundo, mientras que los puntos finales HTTP solo admiten implementaciones regionales, lo que podría contribuir a un ligero retraso en las respuestas.
  • Ambos son de naturaleza altamente segura.
  • Las implementaciones canarias se incluyen con la API REST y no con las API HTTP si esto es un gran problema para su estrategia de implementación.

Para obtener más comparaciones, consulte la guía para desarrolladores de AWS que compara ambas versiones. Aunque las API HTTP son más baratas que REST, ciertamente hay muchas funciones incluidas en la API REST que justifican la diferencia de precio.

En cuanto a nuestra demostración, usaremos API HTTP. Tal vez en un artículo posterior, exploraremos las API REST. En cuanto al concepto, ambos son casi iguales. Usaremos Visual Studio 2022 Community junto con la extensión AWS SDK Kit como hicimos en el artículo anterior sobre Lambda para desarrollar, probar, simular y publicar nuestras Lambdas en la nube de AWS.

Es importante que ya haya leído el artículo anterior sobre AWS Lambda en .NET, donde configuramos las credenciales de AWS a través de la CLI, instalamos el kit de herramientas de AWS en Visual Studio Code. Si no es así, consulte esta publicación de blog.

Creación y publicación de un AWS Lambda con .NET

Primero, abramos Visual Studio 2022 y creemos una solución en blanco. Nombré mi solución como AWSServerless.Dotnet.Demo . Básicamente, tendremos 2 proyectos Lambda en esto, que iremos agregando gradualmente.

  1. Una Lambda ficticia que devuelve un mensaje de saludo. Esta lambda se usará para presentar los conceptos básicos de integración de Amazon API Gateway y otras cosas.
  2. Una Lambda de estudiante, a la que agregaremos varios controladores de función que posiblemente puedan realizar algunas operaciones CRUD básicas contra DynamoDB. (PD, he escrito un artículo sobre Primeros pasos con DynamoDB usando .NET. Échale un vistazo también).

Antes de continuar, asegúrese de tener lo siguiente en su lugar.

  • Configuración de credenciales de AWS a través de la CLI de AWS.
  • AWS Toolkit instalado en su instalación de Visual Studio.
  • Tener una cuenta de AWS. Un nivel gratuito sería más que suficiente.

Puede obtener más información relacionada con los pasos anteriores en mis artículos anteriores sobre aplicaciones sin servidor de AWS con .NET.

crear un proyecto en blanco aws sin servidor Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Agreguemos nuestro primer proyecto Lambda a nuestra solución en blanco. Haga clic con el botón derecho en la solución en Visual Studio y presione Agregar nuevo proyecto. Suponiendo que ya instaló AWS Toolkit en su instancia de Visual Studio, puede buscar AWS Lambda en la ventana emergente "Agregar un nuevo proyecto" que aparece.

devenv iArkd7DjVv Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Haga clic en Siguiente. Aquí vamos a nombrar la lambda HelloLambda. Como se mencionó anteriormente, esta será una lambda simple que nos ayudaría a comprender cómo sería toda la integración con Amazon API Gateway con .NET. Cuando se le pida que seleccione un modelo para su nueva lambda, seleccione "Función vacía". Esto nos da una pizarra limpia para comenzar a construir nuestro Lambda simple.

Ya estará familiarizado con la estructura de carpetas del Proyecto AWS Lambda. Si no, lea este artículo. Abra Function.cs / FunctionHandler. Ahora que vamos a adjuntar este controlador con nuestra API Gateway, debemos realizar algunas pequeñas modificaciones en la firma de este método. Pero antes de eso, instalemos un paquete en este proyecto de Lambda que contenga los contratos. Puede abrir la Consola del administrador de paquetes y ejecutar lo siguiente para instalar el paquete.

Install-Package Amazon.Lambda.APIGatewayEvents

Vayamos y cambiemos nuestro FunctionHandler ahora.

public APIGatewayHttpApiV2ProxyResponse FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
request.QueryStringParameters.TryGetValue("name", out var name);
name = name ?? "John Doe";
var message = $"Hello {name}, from AWS Lambda";
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

APIGatewayHttpApiV2ProxyRequest representa la solicitud entrante de una API HTTP. Si lo piensa, o si mira hacia atrás en el primer diagrama de flujo que teníamos, la solicitud que recibe Lambda no es directamente del cliente, sino una solicitud del mismo Amazon API Gateway. Entonces, en este caso, API Gateway envía una solicitud a Lambda con el tipo APIGatewayHttpApiV2ProxyRequest . De manera similar, APIGatewayHttpApiV2ProxyResponse es el tipo de respuesta que Lambda devuelve a Amazon API Gateway. También puede omitir esta parte de respuesta y, en su lugar, devolver algunos datos cruciales como requisito comercial, como una lista de Estudiantes, que haremos mientras construimos nuestro próximo Lambda más adelante en esta guía.

Estos fueron los principales cambios en Lambda para admitir todo el asunto de la integración de API Gateway. Aparte de eso, el controlador de funciones ahora devuelve un mensaje que dice "Hola {nombre}, de AWS Lambda". Otra cosa aquí es que, desde Lambda, puede acceder al contexto entrante, que incluye cadenas de consulta, parámetros de ruta, rutas, etc. Para este Lambda, espero que la solicitud entrante tenga un parámetro de consulta de nombre (…/hello?name=Mukesh), que luego se agregará al mensaje que finalmente devuelve.

Si el parámetro de consulta no existe, continúa con el nombre predeterminado, que es John Doe. Tenga en cuenta que estamos devolviendo la respuesta como tipo APIGatewayHttpApiV2ProxyResponse, donde Body es el mensaje real, y proporcionamos un código de estado de 200 SUCCESS.

Eso es todo para nuestra Primera Lambda. Publicémoslo en AWS y hagamos una prueba simulada localmente dentro de Visual Studio. Haga clic derecho en el proyecto HelloLambda y haga clic en Publicar en AWS Lambda. Verá la siguiente ventana emergente.

image Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

La herramienta completa automáticamente los primeros detalles, dado que ha configurado sus Credenciales, región y perfil locales de AWS.

  • El nombre de la función es el nombre con el que se identificará Lambda en su cuenta de AWS.
  • Descripción: como sugiere el nombre.
  • El controlador es un poco importante aquí. Digamos que su Function.cs puede tener potencialmente múltiples métodos de controlador. Este método de controlador se asigna a la función exacta a la que necesita que apunte su Lambda. En nuestro caso, es HelloLambda::HelloLambda.Function::FunctionHandler. Tenga esto en cuenta, ya que utilizaremos este campo más adelante en nuestro artículo.

Haga clic en Siguiente.

devenv oEzQI2HY6h Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

En la siguiente pantalla, el único cambio que tendrá que hacer es seleccionar el rol correcto necesario. En nuestro caso, es AWSLambdaBasicExecutionRole. Esto viene con permisos para escribir registros en AWS Cloudwatch. Eso es todo. Haga clic en Cargar. AWS comienza a crear los roles necesarios, ejecuta algunos comandos para crear y lanzar su Lambda localmente, comprime las bibliotecas publicadas y las carga en AWS, que finalmente crea su nueva Lambda brillante.

Amazon API Gateway con .NET: integraciones de AWS Lambda y DynamoDB

Una vez hecho esto, puede abrir la Consola de administración de AWS, navegar a Lambdas y verificar que se haya creado nuestro nuevo Lambda.

imagen 2 Amazon API Gateway con .NET: integraciones de AWS Lambda y DynamoDB

De vuelta en Visual Studio, puede ver que el Asistente de publicación habría abierto una pequeña herramienta que ayuda a probar nuestro Lambda directamente de Visual Studio. Ah, y si aún no lo sabe, también puede simplemente ejecutar la aplicación Lambda en modo de depuración, y Visual Studio activaría una herramienta simulada que esencialmente ayuda a probar y depurar su código Lambda.

Por ahora, exploremos la herramienta integrada en la interfaz de Visual Studio. Aquí hay una captura de pantalla a continuación.

imagen 1 Amazon API Gateway con .NET: integraciones de AWS Lambda y DynamoDB

En primer lugar, esta interfaz le permite enviar solicitudes simuladas directamente a su Lambda que se implementó en AWS. Haga clic en el menú desplegable Solicitud de ejemplo y seleccione API Gateway AWS Proxy. La herramienta llenaría una solicitud de muestra. Aquí, como hice yo, puede agregar una clave/valor de nombre a los parámetros de la cadena de consulta. Hay bastantes propiedades para jugar por aquí. Una vez que haga clic en Invocar, la respuesta tendrá nuestro mensaje con un código de estado de 200.

Ahora, aunque Lambda está listo, realmente no tenemos otra forma de acceder a esta función que no sea desde las herramientas de depuración de VS. Por lo tanto, necesitamos un enlace/punto final al que enviamos una solicitud, y esperamos una solicitud similar de Lambda. Aquí es donde Amazon API Gateway entra en escena.

Creación de Amazon API Gateway con .NET

Comencemos a diseñar nuestro primer Amazon API Gateway. Busque API Gateway en la barra de búsqueda que ve en la Consola de administración de AWS. Verá la página de destino predeterminada para Amazon API Gateway. Aquí se le presentarán opciones para seleccionar un tipo de API. Dado que usaremos la API HTTP, hagamos clic en el botón Generar asociado.

chrome HZudzLTStT Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Dado que nuestro Lambda se creó con éxito, puede seleccionar el tipo de integración como Lambda y elegir nuestra función hello Lambda. Asegúrese de ceñirnos a la versión 2.0 de la carga útil, ya que es la última. Además, asegúrese de seleccionar la región de AWS correcta. En mi caso es ap-sur-1. Con eso hecho, haga clic en siguiente.

chrome ZaswQgDPsT Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Luego viene una parte interesante, donde configuramos las rutas reales que pueden invocar nuestro hola Lambda. Puede ver que lo convertí en un método GET que tendrá un punto final de /hello y apuntará a Hello Lambda. Básicamente, una vez que creamos la puerta de enlace API, AWS nos proporcionará una URL de punto final, a la que si agregamos /hello y enviamos un método GET con los parámetros de consulta apropiados, se activará Lambda y devolverá la respuesta deseada.

Tenga en cuenta que puede realizar múltiples rutas e integraciones aquí. Exploraremos esto cuando creemos nuestra API Gateway completa más adelante en este artículo.

chrome 1j5EYx3xWe Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

A continuación, el Asistente nos pedirá que creemos etapas. Esto será útil si queremos implementar nuestra API Gateway de Amazon en diferentes etapas, como desarrollo, producción y preparación. Pero por ahora, mantengamos el valor predeterminado, que es `$default`, y hagamos clic en Siguiente.

Aquí puede revisar sus cambios e implementar su puerta de enlace. Eso es todo, tan simple como eso.

En la siguiente pantalla, puede ver la URL de Amazon API Gateway que acabamos de crear. Copie esto y abra Postman o cualquier herramienta de prueba de API que use. Además, dado que es solo un método GET, puede incluso usar el navegador para probar nuestro Gateway.

chrome kmkvkIZHmM Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Probemos cómo respondería nuestra API Gateway. Usaré Postman para las pruebas. Asegúrese de que sea un método GET, de lo contrario, Gateway gritará que no se encuentra dicho punto final.

En la siguiente captura de pantalla, puede ver que envié una solicitud al punto final /hello y pasé el nombre del parámetro de consulta como mi Nombre, y también puede ver la respuesta esperada de Lambda. Bastante simple, ¿verdad? Siéntase libre de jugar con Hello Lambda para comprender más al respecto.

Postman 09XFb6JnKd Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Exploración de la interfaz de la consola de Amazon API Gateway

Ahora que hemos creado nuestro primer Amazon API Gateway con AWS Lambdas con tecnología .NET, exploremos la interfaz y las características proporcionadas en Amazon API Gateway.

En la página de inicio, puede ver una lista de puertas de enlace creadas por usted en una región específica de AWS.

chrome RYg52eeVpW Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Una vez que ingresa a una puerta de enlace API específica, obtiene acceso a un montón de funciones interesantes para modificar su puerta de enlace.

chrome C3lh3VJBk3 Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Desde aquí, se llega a:

  • Agregue más rutas a un Amazon API Gateway existente.
  • Protección de Amazon API Gateway mediante Lambdas y JWT. ¡Profundizaremos en esto en el próximo artículo!
  • Administra integraciones y Lambdas.
  • Configure las políticas de CORS.
  • Exportar/Importar definiciones de OpenAPI.
  • Escriba registros de acceso si es necesario. Por lo tanto, cada vez que se envía una solicitud a través de la puerta de enlace API, la solicitud se registra en Cloudwatch. Tendrá que especificar un destino de grupo de registro para esto. Veremos esto más adelante en el artículo.
  • Administrar/Crear etapas, etc.

Ahora que tenemos una comprensión básica de cómo funciona Amazon API Gateway con .NET, construyamos una aplicación sin servidor más avanzada que utilice AWS Lambda, controladores de funciones múltiples, Cloudwatch, DynamoDB para almacenar datos y, finalmente, integremos todos estas Lambdas utilizando una puerta de enlace API de Amazon.

Creación de gestión de estudiantes AWS Lambda con .NET

Construiremos una API simple que puede obtener todos los detalles de los estudiantes, obtener estudiantes por identificación y crear un nuevo registro de estudiante. Agregue un nuevo proyecto de Lambda a nuestra solución y asígnele el nombre StudentLambda. Y sí, crearemos varias Lambdas a partir de un único proyecto Lambda. Eres libre de crear proyectos separados para cada una de las funciones. Pero para el alcance actual de la aplicación y el requisito, no es realmente necesario. Rellenaremos las 3 funciones Lambda en un solo proyecto .NET Lambda y utilizaremos FunctionHandlers para implementar por separado todas las Lambdas en AWS.

Antes de comenzar, asegúrese de instalar los siguientes paquetes Nuget en su proyecto StudentLambda a través de la Consola del administrador de paquetes.

Install-Package Amazon.Lambda.APIGatewayEvents
Install-Package AWSSDK.DynamoDBv2
Install-Package Newtonsoft.Json

Como sabe, el primer paquete es específicamente para usar los contratos de Amazon API Gateway dentro de nuestro .NET Lambda.

El paquete DynamoDB permite que nuestro Lambda se comunique con nuestro DynamoDB. Si no sabe cómo funciona DynamoDB, he escrito una guía completa al respecto aquí . He creado una CRUD ASP.NET Core WebAPI simple que almacena datos en una tabla de AWS DynamoDB.

A continuación, definamos el modelo de estudiante. Con la raíz del proyecto StudentLambda, agregue una nueva clase y asígnele el nombre Student.cs

namespace StudentLambda
{
[DynamoDBTable("students")]
public class Student
{
[DynamoDBHashKey("id")]
public int? Id { get; set; }
[DynamoDBProperty("first_name")]
public string? FirstName { get; set; }
[DynamoDBProperty("last_name")]
public string? LastName { get; set; }
[DynamoDBProperty("class")]
public int Class { get; set; }
}
}

Ahora navegue a AWS DynamoDB y cree una nueva tabla allí como la siguiente.

chrome FCz71W3ljT Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Una vez que cree la tabla, AWS tardará un par de segundos en aprovisionar la tabla en la nube. Agreguemos un registro de muestra a esta tabla. Abra la tabla, presione Explorar elementos de la tabla -> Crear elemento.

Cambie a la vista JSON y agregue un registro de muestra como el siguiente. Tenga en cuenta que las propiedades que he usado son exactamente las mismas que definimos en nuestra clase Student.cs. Haz clic en Crear.

{
"id": 1,
"first_name" : "Mukesh",
"last_name" : "Murugan",
"class" : 10
}

chrome MotUEEQAR1 Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Obtener todos los estudiantes

Escribamos algo de código para devolver una lista de todos los estudiantes de la tabla de DynamoDB. Abra la clase Function.cs de StudentLambda. Elimina el método FunctionHandler predeterminado. y agregue la siguiente función.

public async Task<List<Student>> GetAllStudentsAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
var data = await dbContext.ScanAsync<Student>(default).GetRemainingAsync();
return data;
}

Entonces, esta función esencialmente escanea toda la tabla de DynamoDB, nombra a los estudiantes y devuelve una lista de estudiantes. Tan simple como eso. Tenga en cuenta que crearemos un par de clientes y contextos de DynamoDB para acceder a nuestros datos desde AWS Lambda.

Implementaremos estos Lambdas una vez que se completen los 3. Idealmente, el punto final para este Lambda será <amazon-url>/students [GET] Method.

Crear estudiante

A continuación, a Same Function.cs de Student Lambda, agreguemos otro método que se encargará de crear nuevos registros de estudiantes. A continuación se muestra la función.

public async Task<APIGatewayHttpApiV2ProxyResponse> CreateStudentAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
var studentRequest = JsonConvert.DeserializeObject<Student>(request.Body);
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
await dbContext.SaveAsync(studentRequest);
var message = $"Student with Id {studentRequest?.Id} Created";
LambdaLogger.Log(message);
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

Entonces, aquí esperamos que el cliente envíe un cuerpo JSON con detalles del estudiante.

Línea #3, deserializamos el cuerpo de la solicitud entrante en un objeto Student. Luego creamos un contexto de base de datos para acceder a la tabla dynamoDb y guardamos el registro del estudiante en nuestra base de datos. Una vez hecho esto, devolveremos un mensaje de éxito al cliente como respuesta con un código de estado de 200.

En la línea 8, puede notar que estamos usando una instancia de LambdaLogger para registrar el mensaje en Cloudwatch LogGroup de Lambda. Idealmente, este punto final será el método <amazon-url>/students [POST].

Obtener estudiante por ID

Avanzando hacia nuestra última función lambda, agreguemos una función que pueda devolver estudiantes según la identificación enviada en la solicitud. Esta será una función algo diferente, ya que tendremos que obtener la ID del parámetro de ruta de la solicitud. Por ejemplo, este punto final de implementación se vería como <amazon-url>/students/{id}.

Copie y pegue el siguiente método en Function.cs del proyecto Student Lambda.

public async Task<Student> GetStudentByIdAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
string idFromPath = request.PathParameters["id"];
int id = Int32.Parse(idFromPath);
var student = await dbContext.LoadAsync<Student>(id);
if (student == null) throw new Exception("Not Found!");
return student;
}

En línea #5, estamos extrayendo el ID de estudiante de la propiedad de parámetros de ruta de la solicitud. Una vez que lo recuperamos, lo convertimos en un número entero y lo pasamos al método dynamoDb para obtener el ID del estudiante. Este registro de estudiante se devuelve al cliente como respuesta.

Ahora, todas las funciones de Lamda están creadas. Implementémoslos en AWS.

En Visual Studio, haga clic con el botón derecho en el proyecto StudentLambda y haga clic en Publicar en AWS Lambda. Desplegaremos cada una de las 3 funciones, una tras otra.

Hay 2 puntos a tener en cuenta en la siguiente pantalla. El nombre de la función es "get-all-students" y el controlador apunta al método GetAllStudentsAsync. Así publicamos por separado todas las 3 Lambda. Debes haber captado la idea a estas alturas. Una vez que se cambien estos campos, haga clic en Siguiente.

devenv lP4870ufPw Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

En la siguiente pantalla, deberá seleccionar el rol asociado con este Lambda. Para empezar, puede ser AWSLambdaBasicExecution Role. Sin embargo, hay un problema con esto. Este rol en particular brinda acceso solo para ejecutar Lambda y escribir los registros en Cloudwatch. Pero no hay permiso para acceder a nuestra tabla de DynamoDB, ¿verdad? Arreglaremos esto después de implementar todas las Lambdas.

devenv k3q9el3o6D Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Eso es todo, cargue el Lambda get-all-students.

Repita pasos similares para implementar las Lambdas restantes. Asegúrese de elegir el Rol ya creado para cada uno de estos 2 AWS Lambda.

devenv 12JZFkHk21 Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

devenv fycfsY0BNP Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

devenv jD6jBn30hv Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

¡Eso es todo! Aquí están las Lambdas que creamos hasta ahora.

chrome yqXn6ON0rX Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Adición de permisos de DynamoDB.

Como se mencionó, agreguemos los permisos de DynamoDB requeridos al rol que creamos. Navegue a AWS IAM. Vaya a Políticas y cree una con la siguiente especificación. Como puede ver aquí, seleccionamos DynamoDB como el servicio de AWS y permitimos todas las acciones de DynamoDB, así como todos los recursos.

chrome Ql3GcGoy6E Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Tenga en cuenta que no siempre es una buena idea otorgar permisos completos a un rol en particular. Pero para simplificar las cosas, lo estamos haciendo. No debería hacer esto para aplicaciones de producción. Otorgue solo los permisos que realmente se requieren.

En la página siguiente, asigne un nombre a la política y créela.

chrome ycODtFF4xn Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Ahora que hemos creado la política, anexémosla a nuestros Roles. Seleccione la política recién creada de la lista y haga clic en adjuntar. En la página siguiente, deberá seleccionar el rol/usuario/grupo al que desea adjuntar esta política.

chrome BXL706oAoM Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

En nuestro caso, es lambda_exec_get-all-students

chrome mAu7ftXH2A Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Ahí tienes Adjuntamos con éxito la política al rol que utiliza nuestro AWS Lambda. Ahora Lambda debería tener suficientes permisos para trabajar con DynamoDb.

Conexión de Amazon API Gateway con .NET AWS Lambda

Luego viene la parte crucial de la guía, construir realmente una API Gateway que active cada una de estas lambdas. Abra Amazon API Gateway desde la Consola de administración de AWS.

Hasta ahora, hemos creado solo una API Gateway que es hello . Cree una nueva puerta de enlace API. Como de costumbre, seleccione el tipo de API HTTP y presione Build.

Nombramos a nuestro Gateway como estudiantes y agregamos las 3 Lambdas como integraciones. Sencillo, ¿verdad?

chrome j6Rwc9eHTU Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

En la página siguiente, configuraremos nuestras rutas. Cambiaremos los valores predeterminados y agregaremos la siguiente configuración.

chrome HTdaHTJd1a Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

  • GET /students invocaría get-all-students
  • GET /students/{id} invocaría get-student-by-id donde id es el parámetro de ruta de la solicitud. Por ejemplo, /estudiantes/1
  • Finalmente, POST /students crearía un nuevo estudiante, dado que hemos pasado los detalles del nuevo estudiante como una carga JSON de la solicitud.
     

Deje el escenario como predeterminado y continúe creando la puerta de enlace.

chrome b5Pqmem97h Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Ahí tienes, eso es todo. Probemos este punto final con Postman.

En primer lugar, estoy probando la Lambda get-al-students. Envié una solicitud GET a <url>/students. Como era de esperar, verá una lista de estudiantes como respuesta. Por ahora, solo tenemos un registro en nuestra base de datos.

Postman IEQHc2RddV Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

A continuación, probemos la Lambda get-student-by-id. Envié una solicitud GET a <url>/students/1. Y correctamente devuelve los detalles del estudiante con Id 1.

Postman Z6R9hqnoka Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Finalmente, vamos a crear un nuevo estudiante. Envió una solicitud POST al extremo <url>/students junto con los detalles del estudiante. ¡Y la respuesta es que nuestro Estudiante se crea con ID 2!

Postman 7lDzMoDjEr Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Además, ¿recuerda que escribimos un pequeño registrador en nuestro Create-Student Lambda? Naveguemos a Cloudwatch / Log Groups / create-student y verifiquemos los registros.

chrome kBWX1ReSVr Amazon API Gateway con .NET - Integraciones de AWS Lambda y DynamoDB

Puede ver que nuestro mensaje de registro también se imprime aquí.

Eso es un final para este artículo completo. En el próximo artículo, aprenderemos a proteger API Gateway con Lambda Authorizer. Por ahora, la puerta de enlace API que creamos es un punto final público.

SUGERENCIA importante: asegúrese de eliminar siempre los recursos de AWS que creó una vez que haya terminado de explorarlos. Esto ayuda a reducir los costos incurridos, aunque el nivel GRATUITO le brinda una cantidad bastante decente de solicitudes GRATUITAS para trabajar.

Resumen

En este artículo, aprendimos cómo comenzar con Amazon API Gateway con .NET. Aquí aprendimos sobre la creación de Lambdas básicas que son compatibles con Amazon API Gateway, su integración en DynamoDB, la adición de varias Lambdas a una puerta de enlace en particular, el registro y mucho más. Esto le dará una idea sólida para trabajar con la aplicación sin servidor de AWS. Como la siguiente parte de esta aplicación sin servidor de AWS con .NET, exploraremos cómo asegurar las puertas de enlace de API y cómo trabajar con SAM y mucho más. Manténganse al tanto. Puede seguir este boletín para recibir notificaciones cuando publique nuevos artículos: https://www.getrevue.co/profile/iammukeshm

Comparta este artículo con sus colegas y círculos de desarrollo si lo encuentra interesante. Puede encontrar el  código fuente del proyecto  aquí. ¡Gracias!  

 Fuente: https://codewithmukesh.com/blog/amazon-api-gateway-with-dotnet/

#dotnet #amazon #api 

Pasarela API de Amazon con .NET

.NET を使用した Amazon API ゲートウェイ

この包括的な記事では、.NET スタックを使用した Amazon API Gateway について学習します。これを使用すると、AWS Lambda を非常に簡単に外部の世界に公開できます。

以前の記事で、.NET を使用して AWS Lambda を操作する方法について学びました。これは、サーバーレス アプリケーションを開始するための重要なポイントです。これらの Lambda を AWS に構築してデプロイしましたが、それらを外部の世界から呼び出されるように公開する方法について実際に話したことはありませんでした。

この包括的なガイドではさらに、Amazon API Gateway、Lambda、DynamoDb for Persistence、およびロギング目的の Cloudwatch をシームレスに統合する完全なサーバーレス アプリケーションを構築します。

実装のソース コードはここにあります。

Amazon API ゲートウェイとは?

Amazon API Gateway は、基本的にアプリケーションのビジネス ロジックの世界への扉として機能するゲートウェイを作成できる完全マネージド型のサービスです。このサービスでは、基本的に、Amazon API Gateway の構築方法に応じて、アクセス時に AWS Lambda、パブリック エンドポイント、およびその他のさまざまな AWS サービスに接続するエンドポイントを公開します。

インターネット上で実行されているアプリケーションが、ラムダ内にあるビジネス ロジックにアクセスする必要があるとします。これらのクライアント アプリケーションは Amazon API Gateway に接続し、Amazon API Gateway は関連する AWS Lambda または構成済みの他のサービスにリクエストを内部的にリダイレクトします。

API ゲートウェイを介した一般的なリクエスト フローがどのようなものかを図で見てみましょう。

.NET を使用した Amazon API ゲートウェイ

ご覧のとおり、クライアントは内部でサービスに接続されているゲートウェイにアクセスします。例えば、

  • www.<url-of-aws-gateway>/test -> は、test-lambda という名前のラムダにリダイレクトします
  • www.<url-of-aws-gateway>/get-students -> は、学生のリストを返すラムダにリダイレクトします
  • www.<url-of-aws-gateway>/weather?city=trivandrum -> は、Trivandrum 市の気象データを返すパブリック気象 API エンドポイントにリダイレクトします。

現在、API ゲートウェイは、AWS サーバーレス エコシステム全体の重要な部分であることが多く、あらゆる規模で AWS のサービスに非常にクールで簡単にアクセスできるようになっています。

AWS REST API と HTTP API の比較

AWS は、API Gateway サービスの 2 つのバージョンをサポートしています。最初のリリースは、API ゲートウェイを設計、開発、および維持するための多数の機能を含む REST API バリアント用でした。その後、2019 年頃、AWS はゲートウェイの作成とデプロイを簡素化する HTTP API を導入しました。命名を混同しないでください。これらのバージョンは両方とも、REST 規則に従って HTTP プロトコルに基づいて構築されています。内部的には、AWS はそれらを v1 (REST API) および v2 (HTTP API) と名付けています。

これらのバージョンには、パフォーマンス、価格設定、開発経験など、多くの重要な違いがあります。要するに、HTTP Api はほぼすべての部門で優れており、ほとんどの場合に選択する必要があります。

  • まず、HTTP API はパフォーマンスが向上することを意図しており、REST API と比較してパフォーマンスがほぼ 10 ~ 15% 向上しています。
  • 料金に関しては、月あたり最初の 3 億回のリクエストに対して、HTTP API の費用はわずか 1 米ドルですが、同じ量の場合、REST API の費用は約 3.5 米ドルです。これは大きな違いです。AWS 無料利用枠には、最初の 12 か月間は月あたり 100 万の API (REST & HTTP) が完全に無料で含まれていることに注意してください。これらのクールな技術の両方を探索するのに十分な時間ですよね?
  • これらのゲートウェイの開発中に AWS コンソールによって提供されるユーザー エクスペリエンスは、互いにまったく異なります。
  • REST API は、エンドポイントが世界中に高度に分散されていることを保証するエッジ最適化エンドポイントをサポートしていますが、HTTP エンドポイントは地域展開のみをサポートしているため、応答がわずかに遅れる可能性があります。
  • これらはどちらも本質的に非常に安全です。
  • カナリア デプロイは REST API に含まれていますが、これがデプロイ戦略にとって大きな問題である場合は、HTTP API には含まれていません。

詳細な比較については、これらの両方のバージョンを比較するAWS の開発者ガイドを参照してください。HTTP API は REST よりも安価ですが、REST API には価格差を正当化する非常に多くの機能が含まれていることは確かです。

デモンストレーションでは、HTTP API を使用します。おそらく後の記事で、REST API について説明します。コンセプト的には、どちらもほぼ同じです。Lambda に関する以前の記事で行ったように、Visual Studio 2022 Community を AWS SDK Kit 拡張機能と共に使用して、Lambda を開発、テスト、モックし、AWS クラウドに公開します。

.NET 上の AWS Lambda に関する以前の記事を既に読んでいることが重要です。この記事では、CLI を介して AWS 認証情報をセットアップし、Visual Studio Code に AWS ツールキットをインストールしました。そうでない場合は、このブログ投稿を参照してください。

.NET を使用した AWS Lambda の構築と公開

まず、Visual Studio 2022 を開いて空のソリューションを作成しましょう。ソリューションにAWSServerless.Dotnet.Demoという名前を付けました。基本的に、これには 2 つの Lambda プロジェクトがあり、徐々に追加します。

  1. Hello メッセージを返すダミーの Lambda。このラムダは、Amazon API Gateway 統合の基本などを紹介するために使用されます。
  2. DynamoDB に対していくつかの基本的な CRUD 操作を実行できる複数の関数ハンドラーを追加する Student Lambda。(追伸、.NET を使用して DynamoDB を開始する方法についての記事を書きました。それもチェックしてください。)

続行する前に、次のものがすでに整っていることを確認してください。

  • AWS CLI を介した AWS 認証情報のセットアップ。
  • Visual Studio インストールにインストールされた AWS Toolkit。
  • AWS アカウントを持っている。無料利用枠で十分です。

上記の手順に関連する詳細については、.NET を使用した AWS サーバーレス アプリケーションに関する以前の記事を参照してください。

空のプロジェクトを作成する aws serverless Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

最初の Lambda プロジェクトを空のソリューションに追加しましょう。Visual Studio でソリューションを右クリックし、[新しいプロジェクトの追加] をクリックします。Visual Studio インスタンスに AWS Toolkit が既にインストールされていると仮定すると、表示される [新しいプロジェクトの追加] ポップアップで AWS Lambda を検索できます。

devenv iArkd7DjVv Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

[次へ] をクリックします。ここで、ラムダに HelloLambda という名前を付けましょう。前述のように、これは単純なラムダであり、Amazon API Gateway と .NET との統合全体がどのようになるかを理解するのに役立ちます。新しいラムダの設計図を選択するように求められたら、「空の関数」を選択します。これにより、単純な Lambda の構築を開始するための白紙の状態が得られます。

AWS Lambda プロジェクトのフォルダー構造については、すでによくご存じでしょう。そうでない場合は、この記事を読んでください。Function.cs / FunctionHandler を開きます。この Handler を API Gateway にアタッチするため、このメソッドの署名にいくつかの小さな変更を加える必要があります。しかしその前に、コントラクトを含むこの Lambda プロジェクトにパッケージをインストールしましょう。パッケージ マネージャー コンソールを開き、次のコマンドを実行してパッケージをインストールします。

Install-Package Amazon.Lambda.APIGatewayEvents

それでは、FunctionHandler を変更してみましょう。

public APIGatewayHttpApiV2ProxyResponse FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
request.QueryStringParameters.TryGetValue("name", out var name);
name = name ?? "John Doe";
var message = $"Hello {name}, from AWS Lambda";
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

APIGatewayHttpApiV2ProxyRequest は、HTTP API からの着信要求を表します。考えてみると、または最初のフロー図を振り返ると、Lambda が受け取るリクエストはクライアントから直接ではなく、Amazon API Gateway 自体からのリクエストです。したがって、この場合、API Gateway はAPIGatewayHttpApiV2ProxyRequestタイプのリクエストを Lambda に送信します。同様に、APIGatewayHttpApiV2ProxyResponseは、Lambda が Amazon API Gateway に返すレスポンスのタイプです。この応答部分をスキップして、学生のリストなどの重要なデータをビジネス要件として返すこともできます。これは、このガイドでさらに次の Lambda を構築するときに行います。

これらは、API Gateway 統合全体をサポートするための Lambda の主要な変更でした。それとは別に、関数ハンドラーは「Hello {name}, from AWS Lambda」というメッセージを返すようになりました。ここでのもう 1 つのことは、Lambda 内から、クエリ文字列、パス パラメータ、ルートなどを含む受信コンテキストにアクセスできることです。この Lambda の場合、受信リクエストには名前 (…/hello?name=Mukesh) のクエリ パラメータが含まれ、最終的に返されるメッセージに追加されると予想されます。

クエリ パラメータが存在しない場合は、既定の名前である John Doe が使用されます。応答をタイプAPIGatewayHttpApiV2ProxyResponseとして返すことに注意してください。ここで、Body は実際のメッセージであり、ステータス コード 200 SUCCESS を提供します。

最初の Lambda は以上です。それを AWS に発行して、Visual Studio 内でローカルにモック テストを行いましょう。HelloLambda プロジェクトを右クリックし、[AWS Lambda に発行] をクリックします。次のポップアップが表示されます。

image .NET を使用した Amazon API Gateway - AWS Lambda と DynamoDB の統合

最初のいくつかの詳細は、ローカルの AWS 認証情報、リージョン、およびプロファイルを設定していれば、ツールによって自動的に入力されます。

  • 関数名は、AWS アカウントで Lambda を識別するための名前です。
  • 説明 - 名前が示すように。
  • ハンドラーはここでちょっと重要です。Function.cs が複数の Handler メソッドを持つ可能性があるとします。この Handler メソッドは、Lambda が指す必要がある正確な関数にマップされます。この場合、HelloLambda::HelloLambda.Function::FunctionHandler です。記事の後半でこのフィールドを使用するため、これを覚えておいてください。

[次へ] をクリックします。

devenv oEzQI2HY6h Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

次の画面で必要な変更は、必要な正しい役割を選択することだけです。この場合、AWSLambdaBasicExecutionRole です。これには、ログを AWS Cloudwatch に書き込むためのアクセス許可が付属しています。それでおしまい。[アップロード] をクリックします。AWS は必要なロールの作成を開始し、いくつかのコマンドを実行して Lambda をローカルで構築およびリリースし、公開されたライブラリを圧縮して AWS にアップロードし、最終的に新しい光沢のある Lambda を作成します。

.NET を使用した Amazon API Gateway - AWS Lambda と DynamoDB の統合

完了したら、AWS マネジメント コンソールを開き、Lambdas に移動して、新しい Lambda が作成されたことを確認します。

画像 2 .NET を使用した Amazon API Gateway - AWS Lambda と DynamoDB の統合

Visual Studio に戻ると、パブリッシュ ウィザードが、Visual Studio から直接 Lambda をテストするのに役立つ小さなツールを開いたことがわかります。ああ、まだ気付いていない場合は、Lambda アプリケーションをデバッグ モードで実行することもできます。Visual Studio は、基本的に Lambda コードのテストとデバッグに役立つモック ツールを起動します。

ここでは、Visual Studio インターフェイスに組み込まれているツールについて調べてみましょう。以下はスクリーンショットです。

画像 1 .NET を使用した Amazon API Gateway - AWS Lambda と DynamoDB の統合

まず、このインターフェイスを使用すると、AWS にデプロイされた Lambda にモック リクエストを直接送信できます。Example Request ドロップダウンをクリックし、API Gateway AWS Proxy を選択します。このツールは、サンプル リクエストに対応します。ここでは、私が行ったように、名前のキー/値をクエリ文字列パラメーターに追加できます。ここにはいじるプロパティがたくさんあります。[Invoke] をクリックすると、応答にステータス コード 200 のメッセージが含まれます。

これで Lambda の準備が整いましたが、VS デバッグ ツール以外にこの関数にアクセスする方法はありません。そのため、リクエストを送信するリンク/エンドポイントが必要であり、Lambda から同様のリクエストが返されることを期待しています。これが、Amazon API Gateway の出番です。

.NET を使用した Amazon API Gateway の作成

最初の Amazon API Gateway の設計を始めましょう。AWS マネジメント コンソールに表示される検索バーで API Gateway を検索します。Amazon API Gateway のデフォルトのランディング ページが表示されます。ここで、API タイプを選択するための選択肢が表示されます。HTTP API を使用するので、それに関連付けられている Build ボタンをクリックしましょう。

chrome HZudzLTStT Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

Lambda が正常に作成されたので、統合タイプを Lambda として選択し、hello Lambda 関数を選択できます。バージョン 2.0 のペイロードが最新であることを確認してください。また、適切な AWS リージョンを選択してください。私の場合は ap-south-1 です。それが完了したら、[次へ] をクリックします。

chrome ZaswQgDPsT Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

次は興味深い部分です。hello Lambda を呼び出すことができる実際のルートを設定します。/hello のエンドポイントを持ち、Hello Lambda をターゲットとする GET メソッドにしたことがわかります。基本的に、API ゲートウェイを作成すると、AWS はエンドポイント URL を提供します。これに /hello を追加し、適切なクエリ パラメータを指定して GET メソッドを送信すると、Lambda がトリガーされ、目的の応答が返されます。

ここでは、複数のルートと統合が可能であることに注意してください。これについては、この記事の後半で本格的な API ゲートウェイを作成するときに調べます。

chrome 1j5EYx3xWe Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

次に、ウィザードはステージを作成するように求めます。これは、Amazon API Gateway を開発、本番、ステージングなどのさまざまな段階にデプロイする場合に便利です。しかし、ここでは、デフォルト値の $default のままにして、[次へ] をクリックします。

ここで変更を確認し、ゲートウェイをデプロイできます。それだけです、それと同じくらい簡単です。

以下の画面では、先ほど作成した Amazon API Gateway の URL を確認できます。これをコピーして、Postman または使用する API テスト ツールを開きます。また、これは単なる GET メソッドであるため、ブラウザを使用してゲートウェイをテストすることもできます。

chrome kmkvkIZHmM Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

API ゲートウェイがどのように応答するかをテストしてみましょう。テストには Postman を使用します。GET メソッドであることを確認してください。そうしないと、ゲートウェイはそのようなエンドポイントが見つからないと叫びます。

以下のスクリーンショットでは、リクエストを /hello エンドポイントに送信し、クエリ パラメータ名を自分の名前として渡したことがわかります。また、Lambda からの予期される応答も確認できます。とても簡単ですよね?詳細については、Hello Lambda を自由にいじってみてください。

Postman 09XFb6JnKd Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

Amazon API Gateway コンソール インターフェイスの探索

.NET を利用した AWS Lambda を使用して最初の Amazon API Gateway を作成したので、Amazon API Gateway で提供されるインターフェイスと機能を調べてみましょう。

ホームページには、特定の AWS リージョンで作成したゲートウェイのリストが表示されます。

chrome RYg52eeVpW Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

特定の API ゲートウェイに入ると、ゲートウェイを微調整するための一連の優れた機能にアクセスできます。

chrome C3lh3VJBk3 Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

ここから、次のようになります。

  • 既存の Amazon API Gateway にさらにルートを追加します。
  • Lambda と JWT を使用して Amazon API Gateway を保護します。これについては、次の記事で詳しく説明します。
  • 統合とラムダを管理します。
  • CORS ポリシーを構成します。
  • OpenAPI 定義のエクスポート/インポート。
  • 必要に応じてアクセスログを書き込みます。そのため、API ゲートウェイ経由でリクエストが送信されるたびに、そのリクエストは Cloudwatch にログインされます。これには、ログ グループの宛先を指定する必要があります。これについては、記事の後半で説明します。
  • ステージの管理・作成など。

.NET を使用した Amazon API Gateway がどのように機能するかについての基本的な理解が得られたので、AWS Lambda、複数の関数ハンドラー、Cloudwatch、DynamoDB を使用してデータを保存し、最終的にすべてを統合する、より高度なサーバーレス アプリケーションを構築しましょう。これらの Lambda は Amazon API Gateway を使用します。

.NET を使用した学生管理 AWS Lambda の構築

すべての学生の詳細を取得し、ID で学生を取得し、新しい学生レコードを作成できるシンプルな API を構築します。新しい Lambda プロジェクトをソリューションに追加し、StudentLambda という名前を付けます。はい、1 つの Lambda プロジェクトから複数の Lambda を作成します。機能ごとに個別のプロジェクトを自由に作成できます。しかし、アプリケーションと要件の現在の範囲では、実際には必要ありません。3 つのすべての Lambda 関数を 1 つの .NET Lambda プロジェクトに詰め込み、FunctionHandlers を使用してすべての Lambda を AWS に個別にデプロイします。

開始する前に、パッケージ マネージャー コンソールを使用して、次の Nuget パッケージを StudentLambda プロジェクトにインストールしてください。

Install-Package Amazon.Lambda.APIGatewayEvents
Install-Package AWSSDK.DynamoDBv2
Install-Package Newtonsoft.Json

ご存知のように、最初のパッケージは、.NET Lambda 内で Amazon API Gateway コントラクトを使用するためのものです。

DynamoDB パッケージにより、Lambda は DynamoDB と通信できます。DynamoDB がどのように機能するかをご存じない場合は、ここに完全なガイドを書きました。データを AWS DynamoDB テーブルに保存する単純な CRUD ASP.NET Core WebAPI を作成しました。

次に、学生モデルを定義しましょう。StudentLambda プロジェクトのルートで、新しいクラスを追加し、Student.cs という名前を付けます。

namespace StudentLambda
{
[DynamoDBTable("students")]
public class Student
{
[DynamoDBHashKey("id")]
public int? Id { get; set; }
[DynamoDBProperty("first_name")]
public string? FirstName { get; set; }
[DynamoDBProperty("last_name")]
public string? LastName { get; set; }
[DynamoDBProperty("class")]
public int Class { get; set; }
}
}

AWS DynamoDB に移動し、次のように新しいテーブルを作成します。

chrome FCz71W3ljT Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

テーブルを作成すると、AWS がテーブルをクラウドにプロビジョニングするのに数秒かかります。このテーブルにサンプル レコードを追加してみましょう。テーブルを開き、Explore Table Items -> Create Item をクリックします。

JSON ビューに切り替えて、次のようなサンプル レコードを追加します。使用したプロパティは、Student.cs クラスで定義したものとまったく同じであることに注意してください。[作成] をクリックします。

{
"id": 1,
"first_name" : "Mukesh",
"last_name" : "Murugan",
"class" : 10
}

chrome MotUEEQAR1 Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

すべての学生を取得する

DynamoDB テーブルからすべての学生のリストを返すコードを書きましょう。StudentLambda の Function.cs クラスを開きます。デフォルトの FunctionHandler メソッドを削除します。そして、次の関数を追加します。

public async Task<List<Student>> GetAllStudentsAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
var data = await dbContext.ScanAsync<Student>(default).GetRemainingAsync();
return data;
}

したがって、この関数は基本的に DynamoDB テーブル名の学生全体をスキャンし、学生のリストを返します。それと同じくらい簡単です。AWS Lambda からデータにアクセスするために、いくつかの DynamoDB クライアントとコンテキストを作成することに注意してください。

3 つすべてが完了したら、これらの Lambda をデプロイします。理想的には、この Lambda のエンドポイントは <amazon-url>/students [GET] メソッドになります。

学生の作成

次に、Student Lambda の Same Function.cs に、新しい Student レコードの作成を担当する別のメソッドを追加しましょう。以下、関数です。

public async Task<APIGatewayHttpApiV2ProxyResponse> CreateStudentAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
var studentRequest = JsonConvert.DeserializeObject<Student>(request.Body);
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
await dbContext.SaveAsync(studentRequest);
var message = $"Student with Id {studentRequest?.Id} Created";
LambdaLogger.Log(message);
return new APIGatewayHttpApiV2ProxyResponse
{
Body = message,
StatusCode = 200
};
}

したがって、ここでは、クライアントが生徒の詳細を含む JSON 本文を送信することを期待しています。

3 行目では、受信したリクエストの本文を Student オブジェクトに逆シリアル化します。次に、dynamoDb テーブルにアクセスするための DB コンテキストを作成し、学生のレコードをデータベースに保存します。これが完了すると、ステータス コード 200 の応答として成功メッセージがクライアントに返されます。

8 行目で、LambdaLogger インスタンスを使用してメッセージを Lambda の Cloudwatch LogGroup に記録していることがわかります。このエンドポイントは、理想的には <amazon-url>/students [POST] メソッドになります。

ID で生徒を取得

最後のラムダ関数に進み、リクエストで送信された ID に基づいて学生を返すことができる関数を追加しましょう。リクエストのパス パラメータから ID をフェッチする必要があるため、これは多少異なる関数になります。たとえば、デプロイのこのエンドポイントは、<amazon-url>/students/{id} のようになります。

Student Lambda プロジェクトの Function.cs に以下のメソッドをコピペします。

public async Task<Student> GetStudentByIdAsync(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBContext dbContext = new DynamoDBContext(client);
string idFromPath = request.PathParameters["id"];
int id = Int32.Parse(idFromPath);
var student = await dbContext.LoadAsync<Student>(id);
if (student == null) throw new Exception("Not Found!");
return student;
}

5 行目では、リクエストのパス パラメータ プロパティから学生 ID を抽出しています。取得したら、それを整数に変換し、それを dynamoDb メソッドに渡して、ID で学生を取得します。この生徒の記録は、応答としてクライアントに返されます。

これで、すべてのラムダ関数が作成されました。それらを AWS にデプロイしましょう。

Visual Studio で、StudentLambda プロジェクトを右クリックし、[Publish to AWS Lambda] をクリックします。3 つの機能を順次展開していきます。

以下の画面で注意点が2つあります。関数名は「get-all-students」で、Handler は GetAllStudentsAsync メソッドを指しています。このように、3 つの Lambda をすべて個別に公開しています。あなたは今までにその考えを持っているに違いありません。これらのフィールドを変更したら、[次へ] をクリックします。

devenv lP4870ufPw Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

次の画面で、この Lambda に関連付けられたロールを選択する必要があります。まず、AWSLambdaBasicExecution Role を使用できます。ただし、これには 1 つの問題があります。この特定のロールは、Lambda を実行し、ログを Cloudwatch に書き込むためのアクセスのみを提供します。しかし、DynamoDB テーブルにアクセスする権限はありませんよね? すべての Lambda をデプロイした後、これを修正します。

devenv k3q9el3o6D Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

以上で、get-all-students Lambda をアップロードします。

同様の手順を繰り返して、残りの Lambda をデプロイします。これら 2 つの AWS Lambda のそれぞれに対して、作成済みのロールを必ず選択してください。

devenv 12JZFkHk21 Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

devenv fycfsY0BNP Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

devenv jD6jBn30hv Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

それでおしまい!これまでに作成した Lambda を次に示します。

chrome yqXn6ON0rX Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

DynamoDB アクセス許可の追加。

前述のように、作成したロールに必要な DynamoDB アクセス許可を追加しましょう。AWS IAM に移動します。ポリシーに移動し、次の仕様でポリシーを作成します。ご覧のとおり、AWS サービスとして DynamoDB を選択し、すべての DynamoDB アクションとすべてのリソースを許可しました。

chrome Ql3GcGoy6E Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

特定のロールに完全なアクセス許可を付与することは、必ずしも良い考えではないことに注意してください。しかし、物事をシンプルに保つために、そうしています。本番アプリケーションではこれを行うべきではありません。本当に必要な権限のみを付与してください。

次のページで、ポリシーに名前を付けて作成します。

chrome ycODtFF4xn Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

ポリシーを作成したので、ロールにアタッチしましょう。リストから新しく作成したポリシーを選択し、[アタッチ] をクリックします。次のページで、このポリシーをアタッチするロール/ユーザー/グループを選択する必要があります。

chrome BXL706oAoM Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

私たちの場合、それは lambda_exec_get-all-students です

chrome mAu7ftXH2A Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

ほらね。AWS Lambda で使用されるロールにポリシーを正常にアタッチしました。これで、Lambda には DynamoDb を操作するのに十分な権限が付与されます。

.NET AWS Lambda を使用して Amazon API Gateway を接続する

次は、これらのラムダのそれぞれをトリガーする API ゲートウェイを実際に構築するという、ガイドの重要な部分です。AWS マネジメント コンソールから Amazon API Gateway を開きます。

これまでのところ、 helloである API ゲートウェイを 1 つだけ作成しました。新しい API ゲートウェイを作成します。いつものように、HTTP API タイプを選択し、[ビルド] をクリックします。

ゲートウェイに学生という名前を付け、3 つのすべての Lambda を統合として追加しました。シンプルですね。

chrome j6Rwc9eHTU Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

次のページでは、ルートを構成します。デフォルト値を変更し、以下の構成を追加します。

chrome HTdaHTJd1a Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

  • GET /students は get-all-students を呼び出します
  • GET /students/{id} は get-student-by-id を呼び出します。id はリクエストのパス パラメータです。例: /students/1
  • 最後に、リクエストの JSON ペイロードとして新しい学生の詳細を渡した場合、POST /students は新しい学生を作成します。
     

ステージをデフォルトのままにして、ゲートウェイの作成を続行します。

chrome b5Pqmem97h Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

ほら、それだけです。このエンドポイントを Postman でテストしてみましょう。

まず、get-al-students Lambda をテストしています。<url>/students に GET リクエストを送信しました。予想どおり、学生のリストが応答として表示されます。今のところ、データベースには 1 つのレコードしかありません。

Postman IEQHc2RddV Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

次に、get-student-by-id Lambda をテストしましょう。<url>/students/1 に GET リクエストを送信しました。そして当然、ID 1 の生徒の詳細が返されます。

Postman Z6R9hqnoka Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

最後に、新しい学生を作成しましょう。<url>/students エンドポイントに POST リクエストを学生の詳細とともに送信しました。応答は、学生が ID 2 で作成されたことです!

Postman 7lDzMoDjEr Amazon API Gateway with .NET - AWS Lambda と DynamoDB の統合

また、Create-Student Lambda で小さな Logger を作成したことを覚えていますか? Cloudwatch / Log Groups / create-student に移動して、ログを確認してみましょう。

chrome kBWX1ReSVr Amazon API Gateway with .NET - AWS Lambda & DynamoDB Integrations

ログメッセージもここに出力されていることがわかります。

これで、この包括的な記事は終了です。次の記事では、Lambda オーソライザーを使用して API ゲートウェイを保護する方法について学びます! 今のところ、作成した API ゲートウェイはパブリック エンドポイントです。

重要なヒント: 探索が終了したら、作成した AWS リソースを必ず削除してください。これは、発生するコストを削減するのに役立ちますが、FREE Tier ではかなりの量の無料リクエストを処理できます。

概要

この記事では、.NET で Amazon API Gateway を使い始める方法について学びました。ここでは、Amazon API Gateway と互換性のある基本的な Lambda の作成、DynamoDB への統合、特定のゲートウェイへの複数の Lambda の追加、ロギングなどについて学びました。これにより、AWS サーバーレス アプリケーションを操作するための確かなアイデアが得られます。.NET を使用したこの AWS サーバーレス アプリケーションの次の部分として、API ゲートウェイを保護する方法、および SAM と連携する方法などを探ります。乞うご期待。このニュースレターに従って、私が新しい記事を公開したときに通知を受け取ることができます – https://www.getrevue.co/profile/iammukeshm

この記事が興味深いと思った場合は、同僚や開発者サークルとこの記事を共有してください。プロジェクトのソースコードはこちらにあります  。ありがとう!  

 ソース: https://codewithmukesh.com/blog/amazon-api-gateway-with-dotnet/

#dotnet #amazon #api 

.NET を使用した Amazon API ゲートウェイ

Amazon API Gateway with .NET

In this comprehensive article, we will be learning Amazon API Gateway with .NET stack. Using this, we will be able to expose AWS Lambdas to the external world quite easily.

In a previous article, we learned about working with AWS Lambda using .NET, which is a vital point for getting started with Serverless applications. Although we built and deployed those Lambdas onto AWS, we never really discussed how we would expose them to be invoked by the external world.

Further on in this comprehensive guide, we will be building a complete serverless application that integrates seamlessly between Amazon API Gateway, Lambda, DynamoDb for Persistence, and Cloudwatch for logging purposes.

You can find the source code of the implementation here.

 See more at: https://codewithmukesh.com/blog/amazon-api-gateway-with-dotnet/

#dotnet #amazon #api 

Amazon API Gateway with .NET

A Super Efficient Amazon SQS Thread Based Message Processor for Ruby

I'm looking for Shoryuken maintainers, are you interested on helping to maintain Shoryuken? Join our Slack

Shoryuken

Shoryuken

Shoryuken sho-ryu-ken is a super-efficient Amazon SQS thread-based message processor. 

Requirements

Ruby 2.4 or greater.

Installation

Add this line to your application's Gemfile:

gem 'shoryuken'

If you are using AWS SDK version 3, please also add this line:

gem 'aws-sdk-sqs'

The extra gem aws-sdk-sqs is required in order to keep Shoryuken compatible with AWS SDK version 2 and 3.

And then execute:

$ bundle

Usage

Check the Getting Started page.

More Information

For more information check the wiki page.

Credits

Mike Perham, creator of Sidekiq, and everybody who contributed to it. Shoryuken wouldn't exist as it is without those contributions.

Contributing

  1. Fork it ( https://github.com/phstc/shoryuken/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Testing

To run all unit specs against the latest dependency vesions, execute

bundle exec rake spec

To run all Rails-related specs against all supported versions of Rails, execute

bundle exec appraisal rake spec:rails

To run integration specs, start a mock SQS server on localhost:5000. One such option is cjlarose/moto-sqs-server. Then execute

bundle exec rake spec:integration

Key features


Author: ruby-shoryuken
Source code: https://github.com/ruby-shoryuken/shoryuken
License: View license

#ruby #amazon 

A Super Efficient Amazon SQS Thread Based Message Processor for Ruby
Royce  Reinger

Royce Reinger

1658220240

A Super Efficient Amazon SQS Thread Based Message Processor for Ruby

Shoryuken

Shoryuken sho-ryu-ken is a super-efficient Amazon SQS thread-based message processor.

Requirements

Ruby 2.4 or greater.

Installation

Add this line to your application's Gemfile:

gem 'shoryuken'

If you are using AWS SDK version 3, please also add this line:

gem 'aws-sdk-sqs'

The extra gem aws-sdk-sqs is required in order to keep Shoryuken compatible with AWS SDK version 2 and 3.

And then execute:

$ bundle

Usage

Check the Getting Started page.

More Information

For more information check the wiki page.

Credits

Mike Perham, creator of Sidekiq, and everybody who contributed to it. Shoryuken wouldn't exist as it is without those contributions.

Contributing

  1. Fork it ( https://github.com/phstc/shoryuken/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Testing

To run all unit specs against the latest dependency vesions, execute

bundle exec rake spec

To run all Rails-related specs against all supported versions of Rails, execute

bundle exec appraisal rake spec:rails

To run integration specs, start a mock SQS server on localhost:5000. One such option is cjlarose/moto-sqs-server. Then execute

bundle exec rake spec:integration

Key features

I'm looking for Shoryuken maintainers, are you interested on helping to maintain Shoryuken? Join our Slack

Author: ruby-shoryuken
Source Code: https://github.com/ruby-shoryuken/shoryuken 
License: View license

#ruby #rails #amazon 

A Super Efficient Amazon SQS Thread Based Message Processor for Ruby
Jacob Banks

Jacob Banks

1656391183

How to Build a Food Ordering Chatbot with Amazon Lex and Twilio

Building food ordering chatbot with Amazon Lex

In this talk, I will run through the architectural design and technology choices leveraged on with amazon web services & twilio for building a food ordering chatbot. This talk will also include a real time demo on the overall end user journey where you will practically experience how and when each of the aws services and external integration comes in to play to deliver a real time application.

#chatbot #amazon #twilio #amazonwebservices #amazonlex

How to Build a Food Ordering Chatbot with Amazon Lex and Twilio
Grace  Edwards

Grace Edwards

1656355620

Best Projects Ideas for College Students and Placements

This video is all about college projects if you are a final year student and searching for some cool major and mini project ideas this video might help you. This video contains some cool project ideas which you can make for your college and impress your professors. Also creating these projects will help you land a great job. This video contains also topics that will help you to become a great software engineer.

00:00 - How can you create awesome projects
02:00 - About Newton School
03:05 - First project idea
05:39 - Second project idea
06:57 - Third project idea
08:13 - Fourth project idea
09:28 - Video Summary

#amazon #google

Best Projects Ideas for College Students and Placements
Grace  Edwards

Grace Edwards

1656333746

Top 5 Open Source Programmes for Developers To Contribute & Get Paid

Top 5 open source programmes for developers to contribute and get paid - In this video I have told top open source programmers where you can contribute and get paid. This will be a kind of remote internship which you can do from your home and learn a lot of things and get paid. These open-source programmes are trusted by millions of developers on the planet. So if you are willing to start with open source this video is for you.


00:00 - What is open source and how can you start?
00:34 -  Benefits of open source development
00: 45 - First open source programme
01:15 - Second open source programme
01:44 - Third open source programme
02:31 - Fourth open source programme
03:17 - Fifth open source programme
04:13 - Sixth open source programme
04:55 - How to become a pro software developer
05:17 - About Newton School

#github #google #amazon

Top 5 Open Source Programmes for Developers To Contribute & Get Paid

Amazon Clone Template Built with React, Tailwind CSS and Redux

Amazon-Clone

In this project I used;

  • ReactJs
  • NextJs
  • Firebase
  • Redux
  • Tailwind CSS
  • Deployed with Vercel

Amazon Clone Link => Click Me!

Author

Nazile Tağ

Using npm

Run commands

npm install

npm run dev

Or using yarn

Run commands

npm install --global yarn

yarn install

yarn run dev


Author: Nazile-Tag
Source code: https://github.com/Nazile-Tag/Amazon-Clone
License:

#react-native #react #amazon #tailwindcss #redux 

Amazon Clone Template Built with React, Tailwind CSS and Redux
Ruth  Gleason

Ruth Gleason

1656158400

A Flutter Wrapper for The Amazon Chime SDKs

eggnstone_amazon_chime

A wrapper for the Amazon Chime SDKs. Allows to join Chime meetings using audio and video.

Android

🚩 Chime does not work on Android emulators!

https://github.com/aws/amazon-chime-sdk-android
"NOTE: Please make sure that you are running on ARM supported devices (real devices) or simulator with arm supported. We do not support x86 currently, so simulators with x86 will not work."

The example works on Android emulators as far as showing the version of the SDK.
Anything else will trigger UnsatisfiedLinkError.

Instructions for your app

  • Set the min SDK version to 23 or above. (Chime needs API level 21, but platform views cannot be displayed below API level 23.)

Used Versions

References

iOS

Versions 2 and above do not support iOS

I need a maintainer for the iOS version!

Version 1 has support for iOS but due to file size problems versions 2 and above currently do not support iOS.

🚩 Chime does not work on iOS simulators!

Instructions for your app

Used versions

References

Web

Not included yet and currently no time to do so. Sorry.

References

Use this package as a library

Depend on it

Run this command:

With Flutter:

 $ flutter pub add eggnstone_amazon_chime

This will add a line like this to your package's pubspec.yaml (and run an implicit flutter pub get):

dependencies:
  eggnstone_amazon_chime: ^4.2.1

Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.

Import it

Now in your Dart code, you can use:

import 'package:eggnstone_amazon_chime/eggnstone_amazon_chime.dart';

example/lib/main.dart

import 'dart:convert';
import 'dart:io';

import 'package:chime_example/MeetingSessionCreator.dart';
import 'package:chime_example/data/Attendee.dart';
import 'package:chime_example/data/Attendees.dart';
import 'package:device_info/device_info.dart';
import 'package:eggnstone_amazon_chime/eggnstone_amazon_chime.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';

void main()
{
    runApp(App());
}

class App extends StatefulWidget
{
    @override
    _AppState createState()
    => _AppState();
}

class _AppState extends State<App>
{
    String _version = 'Unknown';
    String _createMeetingSessionResult = 'CreateMeetingSession: Unknown';
    String _audioVideoStartResult = 'AudioVideo: Unknown';
    String _audioVideoStartLocalVideoResult = 'AudioVideoLocalVideo: Unknown';
    String _audioVideoStartRemoteVideoResult = 'AudioVideoRemoteVideo: Unknown';

    Attendees _attendees = Attendees();
    bool _isAndroidEmulator = false;
    bool _isIosSimulator = false;

    @override
    void initState()
    {
        super.initState();
        _startChime();
    }

    @override
    Widget build(BuildContext context)
    {
        var chimeViewChildren = List<Widget>.empty(growable: true);

        if (_attendees.length == 0)
            chimeViewChildren.add(Expanded(child: Center(child: Text('No attendees yet.'))));
        else
            for (int attendeeIndex = 0; attendeeIndex < _attendees.length; attendeeIndex++)
            {
                Attendee attendee = _attendees[attendeeIndex];
                if (attendee.videoView != null)
                    chimeViewChildren.add(
                        Expanded(
                            child: Center(
                                child: AspectRatio(
                                    aspectRatio: attendee.aspectRatio,
                                    child: attendee.videoView
                                )
                            )
                        )
                    );
            }

        var chimeViewColumn = Column(children: chimeViewChildren);

        Widget content;

        if (_isAndroidEmulator || _isIosSimulator)
            content = Padding(
                padding: const EdgeInsets.all(16),
                child: Center(
                    child: Text('Chime does not support Android/iOS emulators/simulators.\n\nIf you see the SDK version above then the connection to the SDK works though.')
                )
            );
        else
            content = Column(
                children: [
                    Text(_createMeetingSessionResult),
                    SizedBox(height: 8),
                    Row(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: [
                            Text('Audio/Video:'),
                            ElevatedButton(
                                child: Text('Start'),
                                onPressed: ()
                                => _audioVideoStart()
                            ),
                            ElevatedButton(
                                child: Text('Stop'),
                                onPressed: ()
                                => _audioVideoStop()
                            )
                        ]
                    ),
                    Text(_audioVideoStartResult),
                    SizedBox(height: 8),
                    Row(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: [
                            Text('Local Video:'),
                            ElevatedButton(
                                child: Text('Start'),
                                onPressed: ()
                                => _audioVideoStartLocalVideo()
                            ),
                            ElevatedButton(
                                child: Text('Stop'),
                                onPressed: ()
                                => _audioVideoStopLocalVideo()
                            )
                        ]
                    ),
                    Text(_audioVideoStartLocalVideoResult),
                    SizedBox(height: 8),
                    Row(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: [
                            Text('Remote Video:'),
                            ElevatedButton(
                                child: Text('Start'),
                                onPressed: ()
                                => _audioVideoStartRemoteVideo()
                            ),
                            ElevatedButton(
                                child: Text('Stop'),
                                onPressed: ()
                                => _audioVideoStopRemoteVideo()
                            )
                        ]
                    ),
                    Text(_audioVideoStartRemoteVideoResult),
                    SizedBox(height: 8),
                    Expanded(child: chimeViewColumn)
                ]
            );

        return MaterialApp(
            home: Scaffold(
                appBar: AppBar(title: Text('ChimePlugin')),
                body: Column(
                    children: [
                        SizedBox(height: 8),
                        Text(_version),
                        SizedBox(height: 8),
                        Expanded(child: content)
                    ]
                )
            )
        );
    }

    void _startChime()
    async
    {
        await _getVersion();

        if (Platform.isAndroid)
        {
            DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
            AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
            if (androidInfo.isPhysicalDevice)
            {
                _addListener();
                await _createMeetingSession();
            }
            else
            {
                setState(()
                {
                    _isAndroidEmulator = true;
                });
            }
        }
        else if (Platform.isIOS)
        {
            DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
            IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
            if (iosInfo.isPhysicalDevice)
            {
                _addListener();
                await _createMeetingSession();
            }
            else
            {
                setState(()
                {
                    _isIosSimulator = true;
                });
            }
        }
        else
        {
            _addListener();
            await _createMeetingSession();
        }
    }

    Future<void> _getVersion()
    async
    {
        String version;

        try
        {
            version = await Chime.version ?? '?';
        }
        on PlatformException
        {
            version = 'Failed to get version.';
        }

        if (mounted)
            setState(()
            {
                _version = version;
            });
    }

    void _addListener()
    {
        Chime.eventChannel.receiveBroadcastStream().listen(
                (data)
            async
            {
                dynamic event = JsonDecoder().convert(data);
                String eventName = event['Name'];
                dynamic eventArguments = event['Arguments'];
                switch (eventName)
                {
                    case 'OnVideoTileAdded':
                        _handleOnVideoTileAdded(eventArguments);
                        break;
                    case 'OnVideoTileRemoved':
                        _handleOnVideoTileRemoved(eventArguments);
                        break;
                    default:
                        print('Chime.eventChannel.receiveBroadcastStream().listen()/onData()');
                        print('Warning: Unhandled event: $eventName');
                        print('Data: $data');
                        break;
                }
            },
            onDone: ()
            {
                print('Chime.eventChannel.receiveBroadcastStream().listen()/onDone()');
            },
            onError: (e)
            {
                print('Chime.eventChannel.receiveBroadcastStream().listen()/onError()');
            }
        );
    }

    Future<void> _createMeetingSession()
    async
    {
        if (await Permission.microphone
            .request()
            .isGranted == false)
        {
            _createMeetingSessionResult = 'Need microphone permission.';
            return;
        }

        if (await Permission.camera
            .request()
            .isGranted == false)
        {
            _createMeetingSessionResult = 'Need camera permission.';
            return;
        }

        String meetingSessionState;

        try
        {
            // Copy the file MeetingSessionCreator.dart.template to MeetingSessionCreator.dart.
            // Adjust MeetingSessionCreator to supply your proper authenticated meeting data.
            // (You can leave the dummy values but you will not be able to join a real meeting.)
            // This requires you to have an AWS account and Chime being set up there.
            // MeetingSessionCreator.dart is to be ignored by git so that your private data never gets committed.

            // See ChimeServer.js on how to create authenticated meeting data using the AWS SDK.

            meetingSessionState = await MeetingSessionCreator().create() ?? 'OK';
        }
        on PlatformException catch (e)
        {
            meetingSessionState = 'Failed to create MeetingSession. PlatformException: $e';
        }
        catch (e)
        {
            meetingSessionState = 'Failed to create MeetingSession. Error: $e';
        }

        if (mounted)
            setState(()
            {
                _createMeetingSessionResult = meetingSessionState;
            });
    }

    Future<void> _audioVideoStart()
    async
    {
        String result;

        try
        {
            result = await Chime.audioVideoStart() ?? 'OK';
        }
        on PlatformException catch (e)
        {
            result = 'AudioVideoStart failed: PlatformException: $e';
        }
        catch (e)
        {
            result = 'AudioVideoStart failed: Error: $e';
        }

        if (mounted)
            setState(()
            {
                _audioVideoStartResult = result;
            });
    }

    Future<void> _audioVideoStop()
    async
    {
        String result;

        try
        {
            result = await Chime.audioVideoStop() ?? 'OK';
        }
        on PlatformException catch (e)
        {
            result = 'AudioVideoStop failed: PlatformException: $e';
        }
        catch (e)
        {
            result = 'AudioVideoStop failed: Error: $e';
        }

        if (mounted)
            setState(()
            {
                _audioVideoStartResult = result;
            });
    }

    Future<void> _audioVideoStartLocalVideo()
    async
    {
        String result;

        try
        {
            result = await Chime.audioVideoStartLocalVideo() ?? 'OK';
        }
        on PlatformException catch (e)
        {
            result = 'AudioVideoStartLocalVideo failed: PlatformException: $e';
        }
        catch (e)
        {
            result = 'AudioVideoStartLocalVideo failed: Error: $e';
        }

        if (mounted)
            setState(()
            {
                _audioVideoStartLocalVideoResult = result;
            });
    }

    Future<void> _audioVideoStopLocalVideo()
    async
    {
        String result;

        try
        {
            result = await Chime.audioVideoStopLocalVideo() ?? 'OK';
        }
        on PlatformException catch (e)
        {
            result = 'AudioVideoStopLocalVideo failed: PlatformException: $e';
        }
        catch (e)
        {
            result = 'AudioVideoStopLocalVideo failed: Error: $e';
        }

        if (mounted)
            setState(()
            {
                _audioVideoStartLocalVideoResult = result;
            });
    }

    Future<void> _audioVideoStartRemoteVideo()
    async
    {
        String result;

        try
        {
            result = await Chime.audioVideoStartRemoteVideo() ?? 'OK';
        }
        on PlatformException catch (e)
        {
            result = 'AudioVideoStartRemoteVideo failed: PlatformException: $e';
        }
        catch (e)
        {
            result = 'AudioVideoStartRemoteVideo failed: Error: $e';
        }

        if (mounted)
            setState(()
            {
                _audioVideoStartRemoteVideoResult = result;
            });
    }

    Future<void> _audioVideoStopRemoteVideo()
    async
    {
        String result;

        try
        {
            result = await Chime.audioVideoStopRemoteVideo() ?? 'OK';
        }
        on PlatformException catch (e)
        {
            result = 'AudioVideoStopRemoteVideo failed: PlatformException: $e';
        }
        catch (e)
        {
            result = 'AudioVideoStopRemoteVideo failed: Error: $e';
        }

        if (mounted)
            setState(()
            {
                _audioVideoStartRemoteVideoResult = result;
            });
    }

    void _handleOnVideoTileAdded(dynamic arguments)
    async
    {
        bool isLocalTile = arguments['IsLocalTile'];
        int tileId = arguments['TileId'];
        int videoStreamContentHeight = arguments['VideoStreamContentHeight'];
        int videoStreamContentWidth = arguments['VideoStreamContentWidth'];

        Attendee? attendee = _attendees.getByTileId(tileId);
        if (attendee != null)
        {
            print('_handleOnVideoTileAdded called but already mapped. TileId=${attendee.tileId}, ViewId=${attendee.viewId}, VideoView=${attendee.videoView}');
            return;
        }

        print('_handleOnVideoTileAdded: New attendee: TileId=$tileId => creating ChimeDefaultVideoRenderView');
        attendee = Attendee(tileId, isLocalTile);
        attendee.height = videoStreamContentHeight;
        attendee.width = videoStreamContentWidth;
        _attendees.add(attendee);

        Attendee nonNullAttendee = attendee;
        setState(()
        {
            nonNullAttendee.setVideoView(
                ChimeDefaultVideoRenderView(
                    onPlatformViewCreated: (int viewId)
                    async
                    {
                        nonNullAttendee.setViewId(viewId);
                        print('ChimeDefaultVideoRenderView created. TileId=${nonNullAttendee.tileId}, ViewId=${nonNullAttendee.viewId}, VideoView=${nonNullAttendee.videoView} => binding');
                        await Chime.bindVideoView(nonNullAttendee.viewId!, nonNullAttendee.tileId);
                        print('ChimeDefaultVideoRenderView created. TileId=${nonNullAttendee.tileId}, ViewId=${nonNullAttendee.viewId}, VideoView=${nonNullAttendee.videoView} => bound');
                    }
                )
            );
        });
    }

    void _handleOnVideoTileRemoved(dynamic arguments)
    async
    {
        int tileId = arguments['TileId'];

        Attendee? attendee = _attendees.getByTileId(tileId);
        if (attendee == null)
        {
            print('Error: _handleOnVideoTileRemoved: Could not find attendee for TileId=$tileId');
            return;
        }

        print('_handleOnVideoTileRemoved: Found attendee: TileId=${attendee.tileId}, ViewId=${attendee.viewId} => unbinding');
        _attendees.remove(attendee);
        await Chime.unbindVideoView(tileId);
        print('_handleOnVideoTileRemoved: Found attendee: TileId=${attendee.tileId}, ViewId=${attendee.viewId} => unbound');

        setState(()
        {
            // refresh
        });
    }
}

Author: eggnstone
Source code: https://github.com/eggnstone/eggnstone_amazon_chime
License: BSD-3-Clause license

#dart #flutter #amazon 

A Flutter Wrapper for The Amazon Chime SDKs