Amazon Translate# Amazon Translateを用いたAWSの実装練習


この記事はAWS初心者の備忘録です。

## 目次

- [目次](#目次)
- [目的](#目的)
- [学習の進め方](#学習の進め方)
  - [前提](#前提)
- [題材](#題材)
- [環境](#環境)
- [1. hands-on通りに翻訳アプリを作成する](#1-hands-on通りに翻訳アプリを作成する)
  - [1.必要条件](#1必要条件)
    - [:warning: 詰りポイント](#warning-詰りポイント)
  - [2. 注意事項](#2-注意事項)
    - [:warning: 詰りポイント](#warning-詰りポイント-1)
  - [4. アーキテクチャ](#4-アーキテクチャ)
    - [利用するAWSサービス](#利用するawsサービス)
  - [5. 構築手順](#5-構築手順)
    - [:warning: 詰りポイント](#warning-詰りポイント-2)
    - [:warning:詰りポイント](#warning詰りポイント)
    - [:warning: 詰りポイント](#warning-詰りポイント-3)
  - [6. 構成の削除](#6-構成の削除)
  - [7. まとめ](#7-まとめ)
- [2. 新しい機能を実装してみる(TBD)](#2-新しい機能を実装してみるtbd)
- [3. qiitaに学習履歴を残す](#3-qiitaに学習履歴を残す)
- [感想](#感想)

## 目的

- クラウドに対する理解を深めること

  1. :+1:知識(AWS資格取得)
     - 無資格→AWS初級取得で達成とする
  2. 開発(実際に手を動かす)
  3. 共有(得た知見を共有して広める)

- 本記事ではhands-onをもとに実際に手を動かし、qiita二投稿することで知見の共有を図る
- わからなかった点を調べてまとめる

## 学習の進め方

### 前提

- AWS初級に合格する程度のAWSに関する知識
- 応用情報技術者試験レベルの情報に関する知識
- AWSアカウントを作成済み

1. hands-on通りに翻訳アプリを作成する
2. 新しい機能を実装してみる
3. qiitaに学習履歴を残す

## 題材

- [Amazon Translate を使って自作音声翻訳サイトを作る](https://aws.amazon.com/jp/builders-flash/202307/voice-translation-website/)

## 環境

- windows 11
- WSL ubuntu

```bash
$ cat /lib/*release*
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
<略>
```

- VScode

## 1. hands-on通りに翻訳アプリを作成する

[Amazon Translate を使って自作音声翻訳サイトを作る](https://aws.amazon.com/jp/builders-flash/202307/voice-translation-website/)通りに進めて疑問に思った箇所を書き留める

### 1.必要条件

hands-onでは以下の条件
> 下記サービスの有効なアカウント
>
> AWS
> GitHub
> AWS CDK の動作環境 : バージョン: 2.79.1
>
> 数十〜数百円程度の AWS 利用料

- 私の環境

```bash
$ cdk --version
2.145.0 (build fdf53ba)
```

- AWS CDKとは
  - [AWS CDKとはなんですか](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html)
  - AWS CloudFormationでクラウドインフラストラクチャをコードで定義するためのOSS
  - 本hands-onでは`translate-function-stack.ts`に設定している
  - [様々な言語でインストール可能](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/work-with.html)(Typescript, JavaScript, Python, Java, C#)

今回はhands-onがTypScriptなので合わせてTypeScriptを用いてインストールする。

- Node.jsとは
  - Webページ作成などの際に使われるJavaScriptを、サーバー側で動作させるプラットフォーム
  - ブラウザ上でしか動かすことのできなかったJavaScriptをサーバで実行できる様になる
  - 大量のリクエストを受けるのが得意
  - 参考
    - [Node.js.org](https://nodejs.org/en)
    - [【入門】Node.jsとは？利用シーンやメリットなどをわかりやすく解説](https://www.kagoya.jp/howto/it-glossary/develop/nodejs/)
    - [Node.jsとはなにか？なぜみんな使っているのか？](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)

#### :warning: 詰りポイント

- パッケージ管理
  Node.js関連でパッケージ管理の概念を理解しておく必要がある。
  - 以下ような機能を持つパッケージマネージャで開発プロセスの効率化をしている
    - パッケージ配布サーバーとの連携
    - インストール/アンインストール管理
    - 依存関係の解決

  - 参考
    - [Wikipedia パッケージ管理システム](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)
    - [ベテランエンジニアも意外と知らない「パッケージ管理システムの仕組み」](https://qiita.com/s_taki/items/1d94e5e9544ebbf32778#1-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)

  - Node.jsのパッケージマネージャは`npm`を使用する
    - npm installとpackage.jsonが存在するディレクトリでコマンドを打てば、package.jsonに記述されている依存パッケージを自動でインストールしてくれる
    - npm installをするとnode_modulesというディレクトリがnpm installを実行したディレクトリに作成され、npmを利用してインストールしたパッケージは、この中に格納される
    - でも[他にもパッケージ管理ツール](https://qiita.com/tak8_al/items/791e8d032bdc13a135de)があるぽい…
  - しかし筆者はパッケージ管理という概念がなく、グローバルインストールしたバージョンとローカルのバージョンの違いがわからなかった。。。
  - また別のパッケージ管理ツール(`asdf`)を使っていたせいで依存関係がカオスになった。。。

### 2. 注意事項

本hands-onで作成するアプリケーションは認証・認可がないためセキュリティ的に脆弱なので、AWSのリソースを無尽蔵に要されかねないので、基本的に立ち上げたらすぐにアプリケーションは落としたほうがいい。

#### :warning: 詰りポイント

- 完全にサービスを落とす方法は？
  - ちょっと課金され続ける(数百円/月)
  - TBD

1. Amazon Translate とは ?

    AWS が提供する深層学習モデルを使用して、従来の統計ベースやルールベースの翻訳アルゴリズムよりも正確で自然な翻訳を提供する言語翻訳自動化のサービス

### 4. アーキテクチャ

[hands-onの図を参照](https://aws.amazon.com/jp/builders-flash/202307/voice-translation-website/#:~:text=%E3%82%82%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,4.%20%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3,-%E5%8B%95%E4%BD%9C%E3%83%95%E3%83%AD%E3%83%BC)

#### 利用するAWSサービス

- [AWS Amplify](https://aws.amazon.com/jp/amplify/hosting/)とは
  - 以下のCI/CDを提供
    1. リポジトリとの接続
    2. ビルド設定の調整
    3. アプリケーションのデプロイ

- [Amazon API Gateway](https://aws.amazon.com/jp/api-gateway/)とは
  - AWS提供のAPIゲートウェイ
  - APIに関するトラフィックモニターやセキュリティなどのタスクを管理できる

- [AWS Lambda](https://aws.amazon.com/jp/lambda/)とは
  - サーバレス(サーバを意識せずにという意味合い)でイベント駆動型のコンピューティングサービス
  - 簡単な処理をスクリプトとして与えて実行できる

### 5. 構築手順

5-1. 環境セットアップ

[AWS CDK (Cloud Development Kit)](https://aws.amazon.com/jp/cdk/)を実施してローカルのWSLにCDKの環境を整備した

#### :warning: 詰りポイント

1. ドキュメントがほぼ英語(英語力を鍛えなければ…)
2. SSOログインの設定がやや面倒
   - tokenを取得したりなど少し面倒
   - ssh接続のための鍵交換みたいな感じ？
3. インストールにやや時間かかる
   - 開発専用のdockerイメージとかあればラクそう
4. [ブートストラップ？](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/bootstrapping.html)
   - デプロイする環境を準備するプロセス
   - 一番初めのデプロイの前に1回だけ行う

```shell
$ cdk bootstrap aws://ACCOUNT-NUMBER/REGION
<略>
$ cdk deploy
Bundling asset TranslateFunctionStack/translate-function/Code/Stage...

  ...f375f8cbb824a5030e04a2bd6635a5a7cbb7c7208cf83662/index.js  21.6mb ⚠️

⚡ Done in 5392ms

✨  Synthesis time: 12.73s

TranslateFunctionStack:  start: Building 
<略>
```

デプロイ後のAWS画面

- CloudFormation

作成したコードがデプロイされているのがわかる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316347/d6274d00-1e22-f93b-32f9-4b37d9586fd7.png)

- lambda

コードで作成したアーキテクチャが自動的に図示化されている

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316347/d5834054-bbd8-a30b-8c3a-0566de1ccd29.png)

5-2. API の構築

#### :warning:詰りポイント

- `NodejsFunction` クラス?
  - [AWS CDKのドキュメント](https://docs.aws.amazon.com/cdk/api/v2/)に記載のあるAPIの中のクラス
    - CDKのAPIを利用することでAWSのサービスをコードで制御できる？
- [CORS](https://aws.amazon.com/jp/what-is/cross-origin-resource-sharing/)とは
  - 「クロスオリジンリソース共有」のこと
  - 特定のドメインにロードされたクライアントウェブアプリケーションが異なるドメイン内のリソースと通信する方法を定義
  - クロスサイトリクエストフォージェリ (CSRF)対策

5-3. 翻訳ページの作成

- 表示するwebページのHTMLとjavascriptコードの解説
- このコードをGithubにプッシュする

5-4. 翻訳ページのデプロイ

- AWSのマネジメントコンソールからAWS Amplifyを使って先ほどプッシュした静的ページのコードをホスティングする

- デプロイした様子

サーバの設定などの細かいところを考えずに簡単にデプロイすることができた。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316347/63459acd-86b0-5828-eb61-153ca69cc714.png)

#### :warning: 詰りポイント

- hands-onの画面と実際の画面に結構差がある。
  - AWSのサービスは高い頻度で更新されるため、その場で何をしているかを考えて手順を進める方が良い

5-5. 動作確認

- AWSの画面をポチポチするだけでwebサービスができあがってしまった！
- ホストするサーバの設定などを考えなくていいから非常に楽

### 6. 構成の削除

- ホストしたサービスはリンクを知っていれば誰でも使えてしまうので構成を削除する

### 7. まとめ

- Happy coding!

## 2. 新しい機能を実装してみる(TBD)

- 認証機能を実装してみる？

## 3. qiitaに学習履歴を残す

- 引き続き更新中

## 感想

- ソフトウェアあるあるだが環境構築がとても大変だった
  - 前提となる知識(特にwebアプリケーションまわり)が多く必要
  - 読まなければならないドキュメントが多い
  - 特にAWSのサービスのドキュメントは細かい文字が多くすべて読んでられなかった。
  - windws環境でも同様のことができるが、linuxベースで開発したほうが考えることが少ないと感じた
- とはいえ余計なことを考えずサービスをすぐにデプロイできる
  - ミドルウェアレベルまではすべてAWSがやってくれる
  - 以前自前でサーバを用意してWEBアプリを作ろうとしたが、サーバの設定がわからず断念した。
  - 今回のhands-onはのべ1～2日でデプロイすることができた。初めて作った割にこれだけのクオリティのものができるのはすごい
- より深みのあるサービスを提供したいと思った
  - 仮に本格的にサービスとして運用するには認証・認可などのセキュリティ・コスト見積もりなどを考える必要がある
  - それらは追々…