おっさん社内SEエンジニアの勉強ブログ

勉強記録のブログとなります。

SAA学習-サーバレス-サーバレスによるサービス化

今回のテーマ:サーバレスによるサービス化

概要

サーバレス化を実現することはAWSを活用する上で必要な観点になります。
振り返りとなりますが、5つの設計原則と11のベストプラクティスの関係図のおさらいで、概略図は以下になります。

f:id:In-houseSE:20211011080738p:plain

サーバではなくサービス

11のベストプラクティスの1つにある「サーバではなくサービス」の考え方より、 マネージド型サービスとサーバレスアーキテクチャを活用し効率的な設計と運用を実現します。
AWSサービスで関連するサービスは以下のものが挙げられます。

関連するサービス

サーバレス化

サーバー(EC2インスタンス)ではなく、Lambdaなどのコンピュートサービスによりシステム構成をできる限り利用します。
現在のAWSアーキテクチャではサーバレス化を進める対応が基本とされております。
概略図は以下になります。

f:id:In-houseSE:20211011081717p:plain

サーバレス化からサービス化

サーバレス設計により疎結合設計が加速します。
疎結合化によってマイクロサービス化されたシステムの構築が可能になります。

サービス化

従来のSOA方式から、小さなプロセス多淫のサービスをAPI連携したマイクロサービスで設計します。
SOAとマイクロサービスについては以下となります。

サービス指向アーキテクチャ(SOA)

マイクロサービス

  • SOAより小さな機能単位のプロセス/トランザクションでサービス化した構成
  • 各プロセスでは1つの小さなタスクをサービスとして適用し、プロセス間通信はAPIを使用

また、疎結合化とマイクロサービス化は表裏一体の関係性にあります。

マイクロサービス化の例

大きなサービスを1つの作業が終了するコンテキスト単位に分割します。
サービスの内訳の例として以下の概略図で、赤字の範囲がマイクロサービスする対象となります。

f:id:In-houseSE:20211011082940p:plain

API活用

マイクロサービスはAPI通信によりコンポーネント間を疎結合化して利用します。

サーバレス化のポイント

利用中のインスタンス本当に必要か設計を見直すことを忘れないすることが大切です。
例えば、メール送受信のみしか使用してないのにメールサーバーとして利用しているかなどあります。

今回のテーマは以上です。

SAA学習-サーバレス-SESの概要

今回のテーマ:SESの概要

概要

Amazon Simple Email Service(SES)は、
フルマネージド型/サーバレス型のコスト効率に優れたEメールサービスとなります。
要点は以下のようなものがあります。

  • スケーラブルな構成で信頼性が高いマネージド型
  • メール送信:トランザクションメールなどの高品質なコンテンツを顧客に送信可能
  • メール受信:受信したメールをトリガーにS3やLambdaなどを起動可能
  • バウンス処理:メールが送れなかった場合の処理を規定

SESのメール送信方法

メールサーバーとして利用するだけではなく、
アプリケーションから自動でメール送信や連携処理が利用可能です。
送信方法は以下の項目は以下があります。

HTTP REST API

  • SendEmail API:From/To/Subject/Bodyだけ用意すればSES型でメッセージを生成し送信
  • RendRawEmail API:メッセージ全体をアプリケーション側で生成し送信
  • 認証:AWSアクセスキーとシークレットアクセスキーを使用

SMTPエンドポイント

  • 生成済みEmailメッセージを受け取ってSESのSMTPエンドポイント経由しメールを送信
  • SMTPを前提としたアプリケーションから直セス利用する場合利用
  • 利用ポート
    -25(SMTP)
    -465(SMTP over SSL)
    -587(Message Submission)
  • TLS(Transport Layer Security)が必要
  • 認証:専用IAMユーザを作成しそのクレデンシャルを使用

SESのメール受信

SESのメール通知を利用してS3やLambdaなどと連携が可能です。
連携時の概略図は以下のようになります。

f:id:In-houseSE:20211011074208p:plain

SES利用準備

事前にドメイン登録やAWS上で利用できるメールとするため、利用申請が必要となります。
AWS側に申請を通すリードタイムがあるため、利用する際は計画し事前対応をします。

今回のテーマは以上です。

SAA学習-サーバレス-SNSの概要

今回のテーマ:SNSの概要

主要サービスの公式資料

SNS

docs.aws.amazon.com

概要

Amazon Simple Notification Service(Amazon SNS)はフルマネージド型のプッシュ型通知サービスで、
他のサービスとの非同期通信を可能とします。

概略図は以下のようになります。

f:id:In-houseSE:20211006073707p:plain

送信側がトピックを作成し、受信側でポリシーを指定することで、制御された非同期通信を実現します。
実装する際は、SNSにてTopicの作成から実装となります。

概略図は以下のようになります。

f:id:In-houseSE:20211006074059p:plain

SNSの特徴

AWSの様々なサービスと連携して通知可能で、疎結合アーキテクチャに利用できます。 要点は以下の項目が挙げられます。

  • 単一発行メッセージ
  • メッセージ通信順番は保証されない
  • 取り消し不可
  • 配信ポリシーによる再試行実施
  • メッセージサイズは最大256KB

SNSとの連携

AWSのサービスと連携する項目は以下のものなどが挙げられます。

  • Amazon CloudWatch:Billing Alertの通知
  • Amazon SES:Bounce/Complaintのフィードバック通知
  • Amazon S3:ファイルがアップロードされたときの通知
  • Amazon Elastic Transcoder:動画変換処理完了/失敗時の通知

SNSとSQSの使い分け

SNSとSQSは処理方式が異なるため、利用シーンに応じて使い分けます。

以下は概要に比較項目になります。

項目 SNS SQS
メッセージ 永続性なし 永続性あり
配信方式 プッシュ型 ポーリング型
プロデゥーサー 発行 送受信
コンシューマー サブスクライブ 送受信

cf)プロデゥーサー キューにメッセージを送信するコンポーネント

cf)コンシューマー キューからメッセージを受信するコンポーネント

今回のテーマは以上です。

ドキュメント管理ツールのgit/TortoiseGitの導入

業務やプライベートで勉強する際、
避けては通れない壁の「git/github」を使用するため、
動作を勉強する上で実施してみました。

今回のテーマ:ドキュメント管理ツールのgit/TortoiseGitの導入

環境設定

  • ローカルPCがWindowsなのでこちらで実施。

gitのインストール

公式サイトへアクセスします。
公式サイト:Git for Windows

公式サイト上から、Downloadをクリックします。

f:id:In-houseSE:20210927112735p:plain

exeファイルのダウンロード確認します。

f:id:In-houseSE:20210927112912p:plain

対象のexeファイルを選択し、右クリックから管理者として実行をクリック
※画面がうまくとりませんでしたので選択まで

f:id:In-houseSE:20210927113032p:plain

ユーザーアカウント制御(UAC)を有効にしている場合、
確認ダイアログが表示されるため、はいをクリック

f:id:In-houseSE:20210927113206p:plain

インストーラー起動後、利用規約が表示され確認後、Nextをクリック

f:id:In-houseSE:20210927113307p:plain

インストール先のフォルダを指定し、Nextをクリック
※デフォルトのインストール先で問題ないです。

f:id:In-houseSE:20210927113403p:plain

インストールするパッケージ選択し、Nextをクリック
※デフォルトのパッケージで問題ありません。

f:id:In-houseSE:20210927113524p:plain

起動パスの名称を指定します。

f:id:In-houseSE:20210927113732p:plain

gitを使用するエディターの指定し、Nextをクリック
今回は、VSCodeを活用するため選択をそちらへ変更します。

f:id:In-houseSE:20210927113948p:plain

gitコマンドで接続時のカレントディレクトリの指定で、Nextをクリック
デフォルトの指定だとmasterがカレントになります。

f:id:In-houseSE:20210927114044p:plain

Windows版なので、gitコマンドを実行する際の指定します。
Bashunixではないため消去法で3rd-party softwareになります。

f:id:In-houseSE:20210927114112p:plain

リモート接続時に使用する実行ツールを指定し、Nextをクリック
デフォルトのssh.exeを使用で問題ありません。

f:id:In-houseSE:20210927114135p:plain

HTTPS接続する際、個別に鍵を使用してなければOpenSSLを指定し、Nextをクリック

f:id:In-houseSE:20210927114150p:plain

gitのリポジトリと同期する際の文字コードの指定し、Nextをクリック

f:id:In-houseSE:20210927114216p:plain

ターミナルの指定は、Windows標準のコマンドプロンプトを指定し、Nextをクリック

f:id:In-houseSE:20210927114236p:plain

リポジトリと同期する「git pull」を実行する際同期方法を指定し、Nextをクリック デフォルトの標準指定で問題ありません。

f:id:In-houseSE:20210927114306p:plain

接続時の認証情報の指定は特に指定ないので、Nextをクリック

f:id:In-houseSE:20210927114322p:plain

個別オプション指定許可の設定で、デフォルトのままで、Nextをクリック
チェック入れなくても問題ありません。

f:id:In-houseSE:20210927114338p:plain

個別オプションの許可選択で、指定はないため、Installをクリック

f:id:In-houseSE:20210927114414p:plain

インストール完了を確認し、Finishをクリック

f:id:In-houseSE:20210927121642p:plain

TortoiseGitのインストール

gitをGUIで管理するためツールに「TortoiseGit」というものがあり、無償ツールのためこちらを活用します。

公式サイトへアクセスします。
公式サイト:tortoisegit.org

公式サイト上から、Downloadをクリックします。

f:id:In-houseSE:20210927133602p:plain

64bitのものを選択します。

f:id:In-houseSE:20210927133635p:plain

インストーラを選択し、右クリックからインストールをクリック

f:id:In-houseSE:20210927133752p:plain

setupの起動を確認し、Nextをクリック

f:id:In-houseSE:20210927133849p:plain

利用規約を確認し、Nextをクリック

f:id:In-houseSE:20210927133932p:plain

SSH接続するためのクライアントツールを選択し、Nextをクリック

f:id:In-houseSE:20210927134037p:plain

インストール内容とインストール先選択し、Nextをクリック

f:id:In-houseSE:20210927134119p:plain

Installをクリック

f:id:In-houseSE:20210927134142p:plain

UACの状態ではダイアログ表示がありその場合、はいをクリック

f:id:In-houseSE:20210927134235p:plain

インストール確認されたことを確認し、Finishをクリック

f:id:In-houseSE:20210927134323p:plain

言語パッチ

言語パッチを選択し、パッチをダウンロードします。

f:id:In-houseSE:20210927134431p:plain

言語パッチをダウンロード後、インストール

f:id:In-houseSE:20210927134509p:plain

セットアップ起動後、次へをクリック

f:id:In-houseSE:20210927134544p:plain

UACの状態ではダイアログ表示がありその場合、はいをクリック

f:id:In-houseSE:20210927134636p:plain

言語設定ウィザードを起動するにチェックし、完了をクリック

f:id:In-houseSE:20210927134719p:plain

初期設定

ローカルブランチとなるフォルダを作成します。

f:id:In-houseSE:20211004092304p:plain

ローカルブランチのフォルダを右クリックし、Gitここにリポジトリ作成を選択します。

f:id:In-houseSE:20211004092703p:plain

リポジトリ作成時の確認ダイアログでBareのチェックを外している状態で、OKをクリック

f:id:In-houseSE:20211004093730p:plain

空のgitリポジトリとして初期化されたことを確認し、OKをクリック

f:id:In-houseSE:20211004093824p:plain

ユーザー名とメールアドレスを登録が要求されるため、はいをクリック

f:id:In-houseSE:20210927135235p:plain

TortoiseGit利用時の確認ダイアログが表示されるため、OKをクリック

f:id:In-houseSE:20210927135333p:plain

名前とメールアドレスを記入後し、適用をクリック

f:id:In-houseSE:20211105133848p:plain

初回コミット

ローカルブランチで試験用のファイルを作成し、フォルダに対しGtコミットを選択します。

f:id:In-houseSE:20211004095101p:plain

アップロードするファイルとコメントを記入し、コミットをクリック

f:id:In-houseSE:20210927135945p:plain

実行確認します。

f:id:In-houseSE:20210927140018p:plain

cf)実務だと先にローカルブランチ側へ同期させてから実行する対応になると考えられます。

Amazon FSx On-Demand Workshopsを可能な限りコストで動かしてみた

実際のWorkshopリンク先:

github.com

無料枠を若干超えるため勉強コストに余裕がある際に実施した方がよいかと思います。
なお、WorkShopを実行する際はCloudFromationで実行するため、
概要を把握しておいた方がよいです。

構成図:

f:id:In-houseSE:20210916110940p:plain

yamlファイルの編集

デモ用のCloudFomasionの指定先はTokyoリージョンにある「Deploy to aws」を選択します。

f:id:In-houseSE:20210916114116p:plain

AWS マネージメントコンソールへログインし、
Cloud Formationのスタックの作成画面が表示されたら、
テンプレートのURLをブラウザで指定しyamlファイルをダウンロードします。

f:id:In-houseSE:20210916114317p:plain

URL:https://s3.amazonaws.com/amazon-fsx/workshop/windows-file-server/templates/fsx-windows-od-workshop.yaml

ダウンロードしたらファイルをエディタソフトで編集します。
InstanceTypeはデフォルトm5.largeのため、t2.micro(無料枠)に変更します。
また、FSxのストレージ容量のデフォルト指定は、5120GBのため、
実行要件で最低の2000GBを指定します。

補足:20GBを指定しましたが、CloudFromation実行後に、
最低2TB指定してくださいとありました。

~上記略~
Parameters:
  AvailabilityZones:
    Description: Select two (2) Availability Zones (AZ). One public subnet and one private subnet will be created in each AZ.
    Type: List<AWS::EC2::AvailabilityZone::Name>
  InstanceType:
    AllowedValues:
    - t2.micro
    Default: t2.micro
    Type: String
  KeyPair:
    Type: AWS::EC2::KeyPair::KeyName
  VpcCidr:
    AllowedValues: 
    - 10.0.0.0/16
    - 173.31.0.0/16
    - 192.168.0.0/16
    Default: 10.0.0.0/16
    Description: Select the private IPv4 CIDR for the VPC.
    Type: String
~中略~
  WindowsFileSystem:
    Type: AWS::FSx::FileSystem
    Properties:
      FileSystemType: WINDOWS
      StorageCapacity: 2000
      StorageType: HDD
      SubnetIds:
        - !Ref PrivateSubnet0
        - !Ref PrivateSubnet1
      SecurityGroupIds:
        - !Ref FileSystemSecurityGroup
      Tags:
        - Key: Name
          Value: MAZ
以下略

変更終了後、CloudFromationの画面へ移動後に、
テンプレートファイルのアップロードを選択し先程更新したyamlファイルをアップロードします。

f:id:In-houseSE:20210916114848p:plain

スタックの名称は任意で記載します。
なお、パラメータの指定は以下にします。

VPC CIDR:パブリックのCIDR
Availability Zone:2つ設定
Instance Type:先程更新したt2.micro
Key pair:便宜上表示してませんが、指定します。

AZの指定は2つ指定します。

f:id:In-houseSE:20210916115056p:plain

スタックオプション

Nameタグはあった方がよいのですが、
動作確認が主目的になるため指定なしで問題ありません。

f:id:In-houseSE:20210916115336p:plain

詳細オプション

特に指定なしで問題ないため、次へをクリック

f:id:In-houseSE:20210916115448p:plain

IAMリソースが作成されることを承認にチェックを入れて、
スタックの作成をクリック

スタックの情報より、ステータスがCREATE_COMPLETEと表示されていることを確認します。 f:id:In-houseSE:20210916125447p:plain

cf)動作確認したら、CloudFormationから削除を実施すると作成したリソースがすべて削除されます。

f:id:In-houseSE:20210916132514p:plain

SAA学習-サーバレス-SQSの概要

今回のテーマ:SQSの概要

AWSが提供するMessage Queueサービスが今回の内容です。

主要サービスの公式資料:

SQS: docs.aws.amazon.com

AWS Black Belt Online Seminar: www.youtube.com

Amazon Sinple Queue Service(SQS)

AWSが提供するプロセス間通信などのスレッド間通信に使われるコンポーネントで、制御やデータを伝達するポーリング型キューサービスとなります。

ポーリングとは

複数のプログラム間通信に対し、一定のタイミングの問い合わせがあった場合、送受信処理を行う通信方式となります。
概略図は以下のようになります。

f:id:In-houseSE:20210901080937p:plain

直接通信の場合、受信側がBusyの状態だと処理が滞る可能性があります。

f:id:In-houseSE:20210901081204p:plain

いったん中継所に通信内容を貯めておいて、受信側のタイミングが良いときに受信の通信を行います。

f:id:In-houseSE:20210901081413p:plain

SQS

SQSはキューをため込んでポーリング処理を実施するサービスとなります。
メッセージデータを受信側が受け取るまでの概略図は以下のようになります。

f:id:In-houseSE:20210901082056p:plain

また、SQSの内訳はRequestキューとResponseキューとなり、送受信をキューイングすることができます。
概略図は以下のようになります。

f:id:In-houseSE:20210901082604p:plain

SQSの特徴

フルマネージド型で提供された高可用性/高スケーラビリティ/高スループット/低コストを実現します。
項目としては以下のようなものがあります。

  • 複数のサーバー/データセンターにメッセージを保持する高可用性構成
  • 多数の送信者と受信者に対応可能なスケーラビリティの確保
  • メッセージが増加しても高いスループットを維持
  • 無料枠と従量課金による低コスト
  • 冗長化などの可用性はAWS側のサービスで構成

また、送受信するデータは256KBまでのデータしか利用できず、60秒から14日間メッセージを保持することができます。
項目は以下のようなものがあります。

項目 概要
メッセージサイズ メッセージの最大サイズは256KB
Extended Client Libraryを利用すると2GBまでのメッセージ送受信が可能
メッセージ保持期限 削除されないメッセージはデフォルトで4日間保持
保存期間は60秒から14日間の間で変更可
In Flightメッセージ 1つのキューごとに最大120,000In Flight(受信されたメッセージ&Visibility Timeout内)メッセージ

キューのタイプ

SQSのキューメッセージの処理順序は、以下の2つの方式から選択します。

  • 標準キュー(デフォルト)
  • FIFO(First in First out)キュー

標準キュー(デフォルト)

標準キューは「順番通りに処理」と「1回だけのメッセージング」をなるべく早く実施する処理となります。

FIFO(First in First out)キュー

最初に入ったキューを最初に処理する順番を守るキューイングを実施する処理となります。

SQSの機能

追加機能を利用することでキューイング処理に工夫することが可能となります。
以下は追加機能の概要となります。

機能名 概要
Short Poling キューが空の場合、即時リターンを実行
Long Poling キューが空の場合、タイムアウトまで待ちを継続
デッドレターキュー ずっと残ったメッセージを別キューに移動し、正常に処理できなかったメッセージを隔離
Visibility timeout 新しいメッセージを指定時間見えなくする

Visibility timeout

Visibility timeoutを設定することで、優先的に処理してほしい受信インスタンスを指定することが可能となります。
概略図は以下のようになります。

f:id:In-houseSE:20210901085240p:plain

今回のテーマは以上です。

SAA学習-サーバレス-疎結合化の追求

今回のテーマ:疎結合化の追求

概要

5つの設計と11のベストプラクティスの対比よりサーバレスの観点は以下のオレンジ色の箇所となります。

f:id:In-houseSE:20210831074834p:plain

コンポーネント疎結合

コンポーネント間の相互依存を減らした構成を取ることにより、1つのコンポーネント変更や障害の影響を削減します。
プログラムの考え方だと構造を分ける認識になります。
なお、関連するAWSサービスは以下のようなものがあります。

  • Lambda
  • SQS
  • ELB
  • SNS

密結合の問題

密結合した構成は障害や修正に弱く不具合が発生しやすい傾向になります。
以下は密結合の概略図となります。

f:id:In-houseSE:20210831075901p:plain

また、密結合のデメリットは以下ようなものがあります。

  • 1インスタンスの障害の影響が全体に影響しやすい
  • 1つの修正対応で他インスタンスへの影響を多く考慮しなければならない
  • 負荷対応やスケーリングも容易にできない
  • システム構成の追加/変更が難しい

疎結合化のメリット

ELBやAPIなどを利用し、結合点を削減したりメッセージ結合にすることで影響を減らすことが可能となります。 以下は疎結合化した場合の概略図となります。

f:id:In-houseSE:20210831080552p:plain

また、疎結合化のメリットとしては以下のようなものがあります。

  • 耐障害性が高まる
  • 負荷対応やスケーリングが容易
  • システム構成の追加/変更が容易

疎結合化のサービス概要

サーバレス化をするサービスやメッセージング処理をするサービスを利用し疎結合化を行います。
以下はAWSサービスとその概要になります。

AWSサービス 概要
ELB サーバー間のトラフィック調整と連携をELBを起点することで疎結合化を実現する
SQS SQSのキューイングによる通信でインスタンス間連携を結ぶことで疎結合化を実現
SNS SNSのアプリケーション間通信でインスタンス間連携を結ぶことで疎結合化を実現
Lambda サーバーインスタンスではなくLambdaによるトリガー処理を連携することで疎結合化を実現

通信系サービスによる疎結合

サーバー間の連携を直接結んで連携すると密結合となってしまいます。
概略図としては以下のようになります。

f:id:In-houseSE:20210831081601p:plain

そのため、サーバー間の連携をメッセージング処理を結ぶことで疎結合化を実現します。
概略図としては以下のようになります。

f:id:In-houseSE:20210831081843p:plain

疎結合化設計

疎結合化設計にはサーバーレス/キューイング通信/マネージド型サービスの利用を組み合わせて設計を行います。
以下は密結合タイプの設計パターンと疎結合化向けの設計パターンになります。

密結合タイプの設計パターン

  • ユーザー認証/管理をバックエンドサーバーで処理
  • 通常のEC2インスタンスでアプリケーションを構成
  • アプリケーション間で直接通信
  • 静的WEBシステムをEC2インスタンスEBSに保存

疎結合化向けの設計パターン

  • ユーザー認証/管理をIAMなどのマネージド型サービスを利用
  • なるべくLambdaなどサーバレスでアプリケーションを構成
  • アプリケーション間はSQSなどMQ(message Queueing)通信で連携
  • 静的WEBシステムをVPC外部のS3に保存

今回のテーマは以上です。