Как да изградим безсървърно приложение, използвайки AWS SAM

В предишната си статия говорих за това как AWS Chalice ви помага бързо да изградите базирано на Python безсървърно приложение и да го разположите на AWS в рамките на няколко минути.

Въпреки че беше бърз и забавен прототип, Python може да не е избраният език за мнозина, когато става въпрос за стартиране на широкомащабни производствени приложения.

Много организации използват Java като основен език за разработка и много разработчици също се придвижват към по-нови езици като Go.

В тази статия ще ви преведа през стъпките, необходими за изграждане и внедряване на същото безсървърно приложение, което получава последните новини от Google News. Но този път ще използваме AWS Безсървърния модел на приложения (SAM) и Java за нашето развитие.

Подобно на Чашата, AWS SAM CLI предлага богат набор от инструменти, които позволяват на разработчиците да изграждат бързо безсървърни приложения.

Предпоставки

Този урок изисква акаунт в AWS. Ако вече нямате такъв, продължете и създайте такъв. Нашето приложение ще използва само свободните ресурси, така че разходите не трябва да бъдат проблем.

Също така трябва да конфигурирате защитата и да създадете потребители и роли за вашия достъп.

Как да конфигурирам идентификационни данни на AWS

SAM използва интерфейса на командния ред на AWS (CLI) зад кулисите, за да внедри проекта. Ако досега не сте използвали CLI на AWS за работа с ресурси на AWS, можете да го инсталирате, като следвате указанията тук.

След като бъде инсталиран, трябва да конфигурирате вашия AWS CLI, за да използвате идентификационните данни от вашия акаунт в AWS.

Как да инсталирам SAM

След това трябва да инсталирате SAM. В този урок ще използваме Java, но можете да използвате всяко езиково изпълнение, поддържано от AWS Lambda.

Проверете инсталирането на Java

$ java --version openjdk 11.0.8 2020-07-14 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.8+10) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.8+10, mixed mode)

Инсталирайте SAM CLI

В зависимост от вашата операционна система, инструкциите за инсталиране на SAM CLI ще варират. Тази статия обхваща инструкциите за инсталирането му на MacOS.

Препоръчителният подход за инсталиране на SAM CLI на macOS е използването на диспечера на пакети Homebrew.

Проверете дали имате инсталиран Homebrew, ето така:

$ brew --version Homebrew/homebrew-core (git revision fe68a; last commit 2020-10-15) Homebrew/homebrew-cask (git revision 4a2c25; last commit 2020-10-15)

Ако не, можете да инсталирате Homebrew, като използвате следната команда:

$ /bin/bash -c "$(curl -fsSL //raw.githubusercontent.com/Homebrew/install/master/install.sh)"

След това инсталирайте SAM, като използвате следната команда:

brew tap aws/tap brew install aws-sam-cli

Проверете инсталирането на SAM

$ sam --version SAM CLI, version 1.6.2

Как да създадете проект

След това изпълнете sam-initкомандата, за да създадете нов проект.

sam init -r java11 -d maven --app-template hello-world -n daily-news-java

По подразбиране SAM създава проект на Python. Тъй като искаме да създадем Java проект, ще трябва да предадем някои допълнителни параметри.

Параметри:

  • -r java11: използвайте Java 11 runtime
  • -d maven: използвайте maven като мениджър на зависимостите
  • --app-template hello-world: използвайте шаблона за бързо стартиране на HelloWorld
  • -n daily-news-java: името на нашия проект

Това ще създаде daily-news-javaпапка в текущата ви директория. Можете да видите, че SAM е създал няколко файла в тази папка.

Нека да разгледаме App.javaфайла.

В sam-initзаповедта създаде проста функция Lambda, че се връща в тялото JSON {"message": "hello world"}и IP адреса на устройството, когато се обади. Вече можем да променим този шаблон и да добавим още код, за да четем новини от Google.

Сега нека да разгледаме template.ymlфайла.

Това съдържа шаблона CloudFormation, който създава нашите Amazon API Gateway и AWS Lambda ресурси.

Конфигурацията Lambda посочва, че имаме HelloWorldFunctionламбда, която работи Java 11и 512 MBпамет.

Конфигурацията на шлюза на API определя един GETметод с /helloпът, който ще използваме за извикване на API.

Ще използваме вътрешните библиотеки за синтактичен анализ на HTTP и XML на Java, така че не е необходимо да добавяме никакви зависимости към нашия pom.xmlфайл.

Обърнете внимание, че по подразбиране, pom.xmlпредоставено като част от кода на шаблона, идва с източника на компилатора, зададен на. 1.8.Ще трябва да го актуализираме, за 11да можем да използваме новата HTTP библиотека, която е част от Java 11

Тъй като Java е обектно-ориентирана, нека създадем и NewsItemклас, който съдържа заглавието и датата на публикуване на новина.

Имайте предвид, че сме заменили toStringметода. Това създава JSON представяне на обекта и избягва използването на всякакви библиотеки за синтактичен анализ на JSON.

Next, you need to add a method to fetch the RSS feed from Google, parse it to extract the news title and publication date, and create a list of news items. To do this, add the following code to your App.java:

Now let’s update the handleRequest method in App.java to invoke this method and return the list of news items as result.

Don’t forget to update the unit tests as well. They were written to test the presence of “hello world” in the response and will start failing after our change.

How to Start the Build

From the daily-news-java folder, run the sam build command.

This compiles your source code and builds any dependencies that you have in the application. It then moves all the files into the .aws-sam/build folder so that they are ready to be packaged and deployed. It also updates the template.yml file accordingly.

How to Test Your Application Locally

Now here’s the beautiful part about SAM. You can deploy and test your application locally! This is really helpful during the development stage when you want to test your code without having to deploy it to AWS.

The SAM CLI provides the sam local command to run your application locally. This internally uses Docker to simulate the execution environment of Lambda. If you don’t have Docker installed, you can get it from here.

We can locally test our application in two ways:

  • Hosting the API locally
  • Directly invoking the Lambda function

Let’s take a look at both of these options.

Local Hosting

Use the following command to start the API locally:

sam local start-api

This internally creates a local server and exposes a local endpoint that replicates your REST API.

Once the Docker container is loaded, you can access the API on localhost, like this:

curl //127.0.0.1:3000/hello

Direct Invocation

Use the following command to invoke the Lambda function:

sam local invoke "HelloWorldFunction" -e events/event.json

This directly invokes the Lambda function (just like we would call the main method) and passes the event.json file as payload.

How to Deploy the Project

Let’s deploy the application. From the daily-news-java folder, run the sam deploy --guided command. Follow the prompts and provide the required inputs (or just press Enter to accept the defaults).

This deploys our application on AWS using Amazon API Gateway and AWS Lambda. It takes the deployment artifacts that we built with the sam build command, packages and uploads them to an Amazon S3 bucket created by the AWS SAM CLI, and deploys the application using AWS CloudFormation.

We can now try accessing the API using the endpoint URL provided above.

How to Clean Up Resources

We can use the aws cloudformation delete-stackcommandto delete the AWS CloudFormation stack along with all the resources it created when we ran the sam deploy command.

Conclusion

Congratulations! You just deployed a serverless application on AWS using AWS SAM. It did involve a bit more work than earlier, but it wasn’t too hard either.

You can now go ahead and make any modifications to your App.java file and rerun sam deploy to redeploy your changes.

The full source code for this tutorial can be found here.

Thank you for staying with me so far. Hope you liked the article. You can connect with me on LinkedIn where I regularly discuss technology and life. Also take a look at some of my other articles on Medium.

Happy reading ?