Використовувані матеріали
- AWS акаунт
- Node.js
- AWS SDK
- AWS SAM
- TypeScript
Спершу створимо додаток,
mkdir translator-aws
cd translator-aws
npm init -y
Створимо репозиторій з такою ж назвою на Github та ініціалізуємо проект:
git init
git add .
git commit -m "initial commit"
git remote add origin [email protected]:ozers/translator-aws.git
git push
Розпочнемо з проекту, спершу встановимо AWS SDK:
npm install aws-sdk
Для використання інструментів AWS потрібно додати роль, важлива заувага: при використанні AWS акаунтів уникайте використання "root account". Можна створити нового користувача та надати йому адміністративну роль.
При наданні доступу користувачам в AWS, важливо дотримуватись принципу "найменших прав" (least privilege), тобто користувач повинен мати лише ті права, які йому необхідні. Тут ми надамо користувачу роль TranslateReadOnly.
Як тип довіреної сутності вибираємо "AWS service". У Service or use case вибираємо "Lambda", оскільки для перекладу ми будемо використовувати "AWS Lambda". Надали роль TranslateReadOnly.
Спочатку шукаємо в AWS Console "Search" і створюємо функцію Lambda. Створимо Lambda-функцію з назвою "translator-aws". Далі спробуємо зробити запит до Amazon Translate.
Для версій Node.js до v18 використання AWS SDK виглядало так, однак для Node.js v18 і новіших версій, де використовується AWS SDK v3, процес імпорту дещо відрізняється.
// Node.js до v18
const AWS = require('aws-sdk');
const translate = new AWS.Translate({ region: 'eu-west-1' });
exports.handler = async (event) => {
...
}
// Node.js v18 і новіші (з AWS SDK v3)
import { TranslateClient, TranslateTextCommand } from "@aws-sdk/client-translate";
const translate = new TranslateClient({ region: "us-east-1" });
export const handler = async (event) => {
...
}
Далі все досить просто. Достатньо передати параметри для перекладу та виконати запит, ми використаємо три параметри: "text, source, target".
Bunun Translate’de karşılığı “Text, SourceLanguageCode, TargetLanguageCode” olacak.
İçerik aşağıdaki şekilde olacak;
import { TranslateClient, TranslateTextCommand } from "@aws-sdk/client-translate";
const translate = new TranslateClient({ region: "us-east-1" });
export const handler = async (event) => {
const {text,source,target} = event const params = {
Text: text,
SourceLanguageCode: source,
TargetLanguageCode: target
};
const command = new TranslateTextCommand(params);
const response = await translate.send(command);
return {
statusCode: 200,
body: JSON.stringify(response),
};
}
Yukarıdaki şekilde bir test yapalım, response body içerisinde metadata ve diğer bilgiler bulunuyor, baktığımızda bu kadar bilgiye ihtiyacımız yok, bunun yerine “body: response” yerine “body: response.TranslatedText” olarak aldığımızda sonuç aşağıdaki gibi olacaktır;
{
"statusCode": 200,
"body": "Amazon Translate makalesinden merhaba!"
}
Params kısmında bir güncelleme yapalım, source değerini vermezsek otomatik algılamasını sağlayalım;
const params = {
Text: text,
SourceLanguageCode: source || 'auto',
TargetLanguageCode: target
};
Aşağıdaki şekilde kullanımda text’in otomatik olarak “en” algılamasını sağlayabiliriz;
// source vererek kullanılan request
{
"text": "Hello from Amazon Translate article!",
"source": "en",
"target": "tr"
}
// source vermeden kullanılan request
{
"text": "Hello from Amazon Translate article!",
"target": "tr"
}
Şimdi bunu bir proje olarak geliştirelim, AWS Lambda ile üzerinde çalışacak şekilde bir geliştirme yapalım ve AWS Cloud’a deploy edelim. Bir HTML sayfası oluşturup da tarayıcıda test edecek hale getirelim. Aynı zamanda projeyi Github’a atacağız.
Translator App Demo
Öncelikle AWS SAM ile bir template oluşturalım, ardından build alacağız. Oluşturmadan önce Homebrew ile sam-cli yükleyelim. Ardından sam build ve sam deploy yapacağız.
Öncelikle projeyi oluşturuyoruz;
mkdir translator-aws
cd translator-aws
npm init -y
Github repo’sunu initialize edelim;
git init
git add .
git commit -m "initial commit"
git remote add origin [email protected]:ozers/translator-aws.git
git push
Şimdi AWS SAM ile projeyi oluşturalım. Uygulamayı oluştururken seçtiğim seçenekler aşağıdadır;
sam init
Which template source would you like to use?
1 - AWS Quick Start Templates
Choose an AWS Quick Start application template
1 - Hello World Example
Use the most popular runtime and package type? (python3.13 and zip) [y/N]: N
Which runtime would you like to use?
13 - nodejs18.x
What package type would you like to use?
1 - Zip
Based on your selections, the only dependency manager available is npm.
We will proceed copying the template using npm.
Select your starter template
1 - Hello World Example
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N
Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: N
Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]: N
Project name [sam-app]: translator-aws
“default” oluşturduğumuz uygulamada “hello-word” olan klasörü “translate” olarak değiştirelim ve devam edelim.
mv hello-world translate
Gerekli olan pakedi kuralım;
cd translate
npm install @aws-sdk/client-translate
“translate” klasörü içerisinde çalıştırıyoruz, çünkü “node_modules” orada oluşturulmalı.
cd ..
sam build
sam validate
Після того як ми виконали build, потрібно провести перевірку за допомогою validate, щоб виявити можливі помилки в “template”.
Після валідації можемо переходити до процесу “deploy”. Для деплою я продовжив з налаштуванням за замовчуванням, але потрібно внести невеликі зміни, оскільки я створив власний S3 bucket і не хочу покладатися на стандартні налаштування. Ви також можете створити власний S3 bucket і використовувати його;
sam deploy — guided — s3-bucket translator-app-bucket — region eu-west-1
Після завершення цих кроків у вас буде API endpoint, який ви можете перевірити, надіславши запит за допомогою cURL, щоб перевірити, чи працює сервіс.
curl -X POST \
https://YOUR_API_ENDPOINT/Prod/translate \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, Im Ozer. Is my Amazon Translate API work?",
"target": "tr"
}'
API відповість наступним чином:
{“translatedText”:”Merhaba, Ben Özer. Amazon Translate API’m çalışıyor mu?”,”sourceLanguage”:”en”,”targetLanguage”:”tr”}
Ми можемо візуалізувати наш API за допомогою HTML, і після додавання HTML отримуємо приклад застосунку, подібний до цього GIF.
Після того як все протестуємо, якщо захочемо видалити застосунок, слід використати команду “sam delete”. Це дозволить видалити весь "stack", створений за допомогою AWS SAM. Якщо цього не зробити, потрібно буде зберігати URL API або обмежити доступ, оскільки наш застосунок працює на AWS Lambda як "serverless" і буде доступний у високодоступному середовищі. У разі атак з великою кількістю запитів ми не хочемо стикатися з неприємними рахунками.
Ви можете використовувати проект за наступним посиланням, якщо виникнуть питання, не соромтесь писати!
https://github.com/ozers/translator-aws
Email: [email protected]
Перекладено з: Amazon Translate ile Çeviri Uygulaması Yapalım