疎結合に向けて


# 疎結合設計
設計にはサーバレス、キューイング通信、マネージドサービスの利用などを駆使した設計を行う。

+ ユーザー認証・管理をIAMなどのマネージドサービスを利用
+ Lambdaなどサーバレスでアプリケーションを構成
+ アプリケーション間でSQS、MQ通信で連携
+ 静的webシステムをVPC外部のS3に保存
+ トランザクション単位でマイクロサービスを設計する





# Amazon SQS(Simple Queue Service)
完全マネージド型のメッセージキューイングサービスのこと。キューイングとは異なるソフトウェア間でデータの送受信する手法の1つで、ソフトウェア間を直接データを渡すのではなく、第三者経由でデータを渡すことで、送信側と受信側が好きな時に処理を行うことができる。
ボーリング処理を合わせて使用するPULL型(ポーリング型配信方式)でメッセージに永続性がある。キューメッセージは**デフォルトで4日間(最大60秒~最大14日で設定可能)保存期間**が存在する

+ **1対1でのやり取り**
+ キューのサイズは最大256KB
+ **処理を分散させてシステムの負荷を下げることができる**
+ SQSキューサイズを確認するAutoScalingトリガーを構成することで、キューサイズに応じてEC２インスタンスのAutoScalingを実行可能
+ VPCエンドポイント（Interface Endpoint）に対応したためVPN経由でオンプレミスからSQSを利用することが可能


![que](https://business.ntt-east.co.jp/content/cloudsolution/images/column/img_column135_02.png)


::: note info
**キューとは？？**
要素を入ってきた順に一列に並べ、先に入れた要素から順に取り出すという規則で出し入れを行うもの。レジ待ちの列をイメージ。
この仕組みを**先入先出**＝**FIFO**(First In First Out)といい、このように管理することを**キューイング**という。
キューの保存期間は1～14日で指定することができる
:::

::: note info
**ポーリングとは？？**
複数の機器やソフトウェアを円滑に連携させるために、主となるシステムが他のシステムに対して一定間隔で順繰りに要求がないか尋ねる制御方式
部下(主となるシステム：コンシューマー)が上司(他のシステム：プロデューサー)に「仕事ありませんか？」と聞くようなもの
:::

つまり、
+ **リクエストや命令文を順番待ちさせて、先に来たものから順番に処理させていくことができる(コンシューマー側で最大10件受信可能)**
+ **並ばせたリクエストや命令文は、処理してくれるシステムが尋ねてくるまで基本的には削除せず保存しておく**

::: note warn
**Amazon SNSのようなプッシュ(相手に送り付ける)機能はない！**
:::




# 機能

### ポーリングリクエスト
処理をするサーバからメッセージキューに向けてのリクエストのことをいう。処理するデータがあればそれを受け取り、なければ空の応答を返す。10秒ごとなど定期的に行われるのが一般的。

### ショートポーリング
キューが空の場合にすぐに空のメッセージが返される


### ロングポーリング
受信メッセージがない時、SQSが待機してから応答を返すことができる機能。0秒~20秒で設定することができる。待機時間を延長することで空の応答を減らすことができ、コストを削減することができる。

### リトライポリシー(リドライブポリシー)
正常に処理できなかったメッセージ(デッドレターキュー)を再処理するためのポリシーのこと。これによりエラーのあるメッセージを何倍も受信することを避ける。最大受信数は1～1000で設定可能
処理サーバが削除せずにメッセージを設定以上受け取るとデッドレターキューに移動する

### Visibility Timeout(可視性タイムアウト)
処理するサーバにメッセージを送信した後、一定時間同じメッセージを他のサーバに見せないようにする機能がある。これにより他のシステムが二重で同じ処理をしなくて済む。0秒～12時間で設定可能




# いろんなキュー
### 標準キュー
![標準キュー](https://d1tlzifd8jdoy4.cloudfront.net/wp-content/uploads/2022/06/sqs-what-is-sqs-standard-queue-diagram.29963b2823bc048492c7af2757535d500aa2c159.png)

1秒間にほぼ無限のトランザクションを実行することが可能。メッセージは最低1回配信されるが、複数回発信されることもある。メッセージの配信順序が変わる可能性あり

### FIFOキュー
![FIFO](https://d1tlzifd8jdoy4.cloudfront.net/wp-content/uploads/2022/06/Screenshot-2022-06-14-at-1.50.23-PM-1-768x187.png)

First In First Outの略で「先入れ先出し」を意味する。先に到着したものが先に処理される。メッセージは時系列で送受信されるため、処理が中断する可能性はない。TPS(1秒あたりのトランザクション数)の制限があるため、1秒当たり300件が限度になる。メッセージの重複排除も行ってくれる

メッセージIDを利用することで同じグループのメッセージはまとめてグループ毎に送信される



### デッドレターキュー
正常に処理できないメッセージがキュー内に残り続けないように、移動させる機能。
また、デッドレターキューに入ったキューは一時的な障害等でない限り残り続ける。

### 遅延キュー(Delivery delay)
キューへの新しいメッセージ配信を0秒~15秒で遅延させることができる。キューが発行された直後から見えなくなる

### 優先度付きキュー
キューの処理順番に優先度をつけることができる

### 一時キュー
高スループットでコスト効率に優れたアプリケーション管理向けに利用されるキュー。リクエストとレスポンス処理を実装できる。使用されなくなると、クライアントは一時キューを自動的にクリーンアップする。追加のコストの発生はない。

![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/fa1041a8-613f-1610-2d53-a2cbdd18b713.png)





# Amazon SNS(Simple Notification Service)
フルマネージド型のプッシュ型通知サービスのこと。送信側がトピックを作成し受信側をポリシー設定することで他のサービスとの非同期通信を可能にする。メッセージは永続的ではなく、配信されたメッセージは終了になる。

+ **メッセージ通信順番は「FIFOトピック」により保障可能**
+ HTTP,HTTPS,JSON形式のメッセージを利用可能
+ 一度配信されたメッセージは取り消し不可

### 主な連携サービス
| サービス名 | 内容 |
|:-:|:-:|
| Amazon CloudWatch  | Bilimg Alertの通知  |
| Amazon SES  | Bounce/Complaintのフィードバック通知  |
| Amazon SQS  | 通知によりキューを配信して処理を実行。SNSと掛け合わせた構成を**ファンアウト構成**と呼ぶ  |
| Amazon S3  | ファイルがアップロードされた時の通知  |
| Amazon Elastic Trancoder  | 動画変換処理完了/失敗時の通知  |
| AWS Lambda  | トリガーとして処理を起動  |


# Amazon SES(Simple Email Service)
フルマネージド型のサーバレス型のコスト効率に優れたEメールサービス。スケーラブルな構成で信頼性が高く、受信したメールをトリガーにS3やLambdaなどを起動可能
利用するにはドメイン登録やAWS上で利用できるメールとするための利用申請を事前に行う必要がある

### メール送信方法
メールサーバーとして利用するのではなく、アプリから自動でメール送信や連携処理に利用可能

+ **HTTP REST API**

| 項目 | 内容 |
|:-:|:-:|
| SendEmail API | From/To/Subject/Bodyだけ用意すればメッセージを生成して送信できる  |
| SendRawEmail API | メッセージ全体をアプリケーション側で生成して送信する  |
| 認証 | AWSアクセスキーとシークレットアクセスキーを使用|


+ **SMTPエンドポイント**
生成済みEmailメッセージを受け取ってSESのSMTPエンドポイントを経由してメールを送信する。

利用ポート：25、465(SMTP over SSL)、587(Message Submission)
認証：専用IAMユーザーを作成してそのクレデンシャルを使用





# AWS Lambda
サーバーレスのコンピューティングサービスのこと。文字通り、サーバ不要でプログラミングコードのみで実行や処理などを行ってくれるもの。**コードのリクエスト数とコードの実行期間で料金が発生するので、EC2インスタンスから置き換えることによって、コスト削減が期待できる**。

+ **関数のタイムアウト時間はデフォルト値3秒で、許容最大値は900秒**。タイムアウトに達すると関数が停止される
+ 関数の最大実行数はデフォルトは100、最大1000(申請によって数十万まで引き上げ可能)
+ 実行時のメモリ量は128MB~10240MB(10GB)の範囲
+ 他のAWSリソースへのアクセスは、そのサービスに対するアクセス権限を付与するIAMロールが必要

+ **ポリシーをLambda関数に追加することで、EventBridgeが関数を呼び出すことが可能**
`"Action":"lambda:InvokeFunction"`
`"Principal":"Service: events.amazonaws.com"`


![lambda](https://pages.business-on-it.com/rs/277-TSU-614/images/aws-lambda-performance-check1.png)


## Lambdaの呼び出し方
### Synchronous Invokes(同期呼び出し)
実行するタイミングとLambdaが処理するタイミングが同じ。同期する際はLambdaにあらかじめ関数をセットしておく必要がある。テスト実行は同期呼び出しに分類される

### Asynchronous Invokes(非同期呼び出し)
実行するタイミングとLambdaが処理するタイミングが異なる。S3イベント通知からLambdaを実行する際は非同期呼び出しになる。並列処理をすることができ、大量に処理を裁くことができるのが特徴

+ エラーが発生した場合自動でリトライが行われる。
+ 最大試行回数(リトライ回数)は0回、1回、2回から設定可能
+ **冪等性(べきとうせい)を担保すること**
⇒ある操作を1回行っても複数回行っても結果が同じであることをいう概念

+ 処理が失敗した場合SQSまたはSNSにデッドレターキューが送られる
⇒デッドレターキュー作成時にはIAMロールをアタッチする必要がある


![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/ae98f35a-40d6-6084-c933-6b64fc805b6f.png)


### Poll-Based Invokes(イベントソースマッピング)
**連携サービス：Amazon Kinesis,DynamoDB Stream,SQS**
イベントソースから読み取ってLambda関数を呼び出す。


![pollbased](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/features-eventsourcemapping.png)

## バージョン管理
バージョニング機能が備わっている。バージョン番号は1つずつ数字が繰り上がり、コードと設定情報が含まれる。バージョンが作成されると環境変数などの変更は不可になる。編集できるの最新バージョン「`$LATEST`」がついたタグのみになる

過去のバージョンはエイリアスで別名を指定することができる。エイリアスは変更可能、加重ルーティングを設定できる。

## ブループリント
Lambdaファンクションをコーティングする際にサンプルコード集を利用することが可能

## Lambda@edge
グローバルにLambda関数を展開して、アプリケーションやコンテンツアクセスを最適化する。CloudFrontにLambda機能を連携することで、世界中でユーザーに近いロケーションにおいてコードを実行できる

## Function URLs
Lambda関数をAWS認証なしのHTTPS経由で実行するには、API Gatewayを設置する必要があった。この機能により、設置することなくHTTPS公開をすることができるようになった。

## Lambda Layer
複数のLambda関数でライブラリを共有できる仕組み。最大5つまで一定の機能をまとめて構成することができる。ライブラリをLayerとしてアップロードしておくことで、個々の関数は共通のLayerを使用することができる。

## デッドレターキュー
障害発生時の送信先に代わる方法として、配信不能キューを使用して関数を設定し、破棄されたイベントを保存してさらに処理できる。デッドレターキュー内のイベントを再処理するには、デッドレターキューを Lambda 関数のイベントソースとして設定するか、イベントを手動で取得することもできる。

+ 標準Amazon SQSキューまたは標準Amazon SNSトピックを選択可能

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-async.html#invocation-dlq



# AWS StepFunctions
複数のAWSサービスをサーバーレスのジョブ管理ワークフローとして連携させることで、アプリの構築や更新を行えるようにするもの。イベント駆動型のビジュアルワークフローサービス。
ワークフローは障害、再試行、並列化、サービス統合、可観測性などを管理するため、開発者はより価値の高い作業に集中できる

+ 人的な確認プロセスを含めたワークフローをシステム化できる
+ 関数やコンテナを作成する必要がないため、高い回復力と管理容易性を備えたアプリケーションを作成可能
+ オンプレミスサーバーで実行されるデータとサービスのオーケストレーションを行うこともできる


![step](https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/step-function.png)

### ワークフローの種類
ステートマシンを作成する際は以下のタイプを選択する。作成後は変更不可

+ **Standardワークフロー**
1回のみのワークフローで長期間（最長1年）実行され、耐久性があり、監査可能なワークフローに最適。


+ **Expressワークフロー**
IoTデータの取り込み、ストリーミングデータ処理と変換、モバイルアプリケーションのバックエンドなど、大容量のイベント処理ワークロードに最適。最大5分間実行可能。実行回数、実行時間、実行中に消費されたメモリによって請求される。






# Amazon SWF(Simple Workflow Service)
分散したアプリケーションコンポーネント間の作業を簡単に調整できるようにするwebサービス。メディア処理、webアプリケーションのバックエンド、ビジネスプロセスのワークフロー、分析パイプラインなど様々なユースケースのアプリケーションをタスクの調整として設計することを可能にする




 # Amazon MQ
AWSで提供されているApache ActiveMQ向けのマネージド型メッセージブローカーサービス。ソフトウェアのアップグレードやセキュリティ更新、障害検知などの管理タスクを処理でき、総合的な管理が容易に行うことができるようになる

::: note info
**・メッセージブローカーとは？**
異なるシステム間でメッセージをやり取りする際に、中間システムとしてメッセージ格納領域を管理する機能のこと。SMSなどのメッセージではなく、**システムからシステムに送信される指示や渡す情報のことを指す**
:::

### アクティブ/スタンバイブローカー
2つの異なるAZにある2つのブローカーが冗長的にペアで構成される。1つのブローカーインスタンスが正常に機能しない場合、スタンバイインスタンスがアクティブになり受け入れを開始してくれる。Amazon EFSと同期的に通信を行うことで、最高レベルの耐久性と可用性を実現することができる。



![active](https://docs.aws.amazon.com/ja_jp/amazon-mq/latest/developer-guide/images/amazon-mq-activemq-broker-architecture-active-standby.png)

### ストレージ
Amazon EFS、Amazon EBSどちらかを使用することが可能。デフォルトではEFSで設定されている。

+ **Amazon EFS**
複数のAZ全体で優れた耐障害性とレプリケーションを活用するために利用される。ユースケースとして金融取引が挙げられる。

+ **Amazon EBS**
低レイテンシーと高スループット用に最適化されており、単一のAZ内にある複数のサーバ全体にレプリケートされる。ユースケースとして大量のテキスト、注文処理などがある。

::: note warn
EBSを使用できるのは`mq.m5`ブローカーインスタンスファミリーのみ
:::



# Amazon API Gateway
どんな規模のシステムであっても簡単にAPIの作成、配布、監視、保護を行う完全マネージド型サービス。トラフィック管理、認可とアクセスコントロール、モニタリング、APIバージョン管理などのタスクの取り扱いや、クライアントから受け取ったリクエストをそれぞれのマイクロサービスにルーティングする。

### REST API(Representational State Transfer Application Programming Interface)
Webアーキテクチャスタイルの一つであり、ネットワーク上での情報のやり取りに使用される一般的な方法。異なるシステムやプラットフォーム間でのデータや機能の共有を容易にする柔軟でスケーラブル方法で、多くのWebサービスやアプリケーションがREST APIを使用して、データの取得、更新、削除などの操作を提供している。
Lambdaと連携して拡張性と伸縮性の高いソリューションを設計することが可能


### 使用量プラン
レート(1秒あたりのリクエスト数)とクォータ(日、週、月当たりの可能なリクエスト数)を回数設定することができる。作成した使用量プランはAPIで用意している特定のステージに紐づけることで有効になる。

### APIキー
APIへのアクセスを付与するために顧客のアプリケーションデベロッパーに配布する英数字の文字列値。API キーとLambdaオーソライザー、IAM ロール、Amazon Cognitoを一緒に使用してアクセスを制御できるため、未認証ユーザーからのリクエストをブロックすることができる。



# 参考
https://aws.amazon.com/jp/builders-flash/202302/asynchronous-processing-and-queue/?awsf.filter-name=*all

https://business.ntt-east.co.jp/content/cloudsolution/column-135.html


https://stra.co.jp/aws/2020/04/28/174/

https://dev.classmethod.jp/articles/aws-step-functions-for-beginner