aws saaの勉強
AWS Elastic Beanstalkについて
AWS Elastic Beanstalk は、AWS でウェブアプリケーションを立ち上げて稼動させるのに最も速い方法です。アプリケーションのコードをアップロードするだけで、リソースのプロビジョニング、ロードバランシング、オートスケーリング、モニタリングなどの細かい作業はサービスが自動的に処理します。
デプロイが簡単、監視もしてくれる、ロードバランシングとオートスケーリングもしてくれる
っていうマネージドサービス
パッチも適用してくれるらしい
→webアプリの開発に注力することができる(インフラのことを考える必要が少ない)
AWS Elastic Beanstalk で追加料金は発生しません。アプリケーションの保存、実行に必要な AWS リソース (EC2 インスタンス、S3 バケットなど) に対してのみ料金が発生します。実際に使用した分に対してのみ料金が発生します。最低料金や前払いの義務はありません。
beanstalk自体の料金は発生しないのは驚き
AWS Elastic Beanstalkの裏側ではEC2インスタンスが生成されますが、そのEC2インスタンスがリソースを持て余して『リソースの無駄』が発生することがあります。
例えば「Dockerプラットフォーム」を利用している場合、AWS Elastic Beanstalkでは1台のEC2インスタンスに対して1コンテナが立ち上がります。もし1つのコンテナがリソースをそんなに使わない場合はリソースを効率的に利用するために1台のEC2インスタンスに対して複数のコンテナを立ち上げる方が無駄のないリソース利用が出来ます。
Amplify同様、作りこみにくいというデメリットがあるのでエンタープライズな実プロジェクトで使うことはほとんどありませんが、試験向けにはデプロイ手法がよく聞かれるので知っておいて損はありません。
デメリットはこんな感じかな...
個人開発とか小規模のものだったら使う価値はありそう
ECS/EKS/ECRについて
ECSとEKSはそれぞれコンテナ環境を運用するサービス
- ECS : Docker、使用可能なコンピューティングサービスはEC2, Fargate
- EKS:k8s、使用可能なコンピューティングサービスはEC2だけ
ECRはコンテナイメージのアップロード、管理をしてくれるサービス
ecrに登録されているイメージはECS、EKSだけでなくオンプレでも使うことが可能である
- タスク:EC2,Fargate上で実行されるコンテナを管理する単位
- サービス:複数のタスクをまとめて管理する単位(サービス内で4つのタスクを実行する、1つ落ちた場合は復旧するみたいな)
- クラスター:タスクまたはサービスをまとめて管理する単位
タスク定義
- 実行するコンテナイメージ
- CPUやメモリのスペック
- タスクロール(IAMロール)
EKSでポッド数を自動的に増減させる方法
- Horizontal Pod Autoscaler (HPA)を使用
- CPU利用率やメモリ使用量に応じてポッド数を増減させる
- Metrics Serverを導入
- HPAで使用するメトリクスを収集する
EC2について
コンピューティングサービス
基盤について
- マルチテナンシー:普通のやつ
- ハードウェア占有インスタンス
- Dedicated Hosts
ハードウェア占有インスタンスとDedicated Hostsの違い
ハードウェア占有インスタンス
ハードウェア専有インスタンスとは、単一の AWS アカウント専用のハードウェア上で動作する EC2 インスタンスです。つまり、ハードウェア専有インスタンスは、それらのアカウントが単一の支払者アカウントにリンクされている場合でも、他の AWS アカウント に属するインスタンスからホストハードウェアレベルで物理的に分離されています。ただし、ハードウェア専有インスタンス は、同じ AWS アカウント に属する、ハードウェア専有インスタンスではない他のインスタンスとはハードウェアを共有できます。
Dedicated Hosts
専有ホストは、インスタンスの配置を可視化および制御し、ホストアフィニティをサポートします。つまり、特定のホストでインスタンスを起動して実行でき、インスタンスが特定のホストでのみ実行されるようにできます。詳細については、「Amazon EC2 専有ホストの自動配置とホストアフィニティ」を参照してください。
つまり、ハードウェア占有インスタンスは、インスタンスが配置されるホストに他のAWSアカウントに属するインスタンスが存在しないことを保証してくれるもの
Dedicated Hostsはインスタンスを配置する時にホストを指定することが可能なもの
Dedicated Hostsの方が加えられる制限が大きい
ハードウェア占有インスタンスは他組織とホストを共有したくない時に使って、Dedicated Hostsは既存ライセンスの持ち込み(BYOL)を行いたい時などに使う
ユーザーデータ
- インスタンス起動時に実行されるbashコードなどを指定できる(ブートストラップ)
ストレージ
- インスタンスボリューム:停止、終了したらデータ削除される。無料
- EBS:停止、終了しても削除されない。S3にスナップショットを保存する。有料。
- EFS:サーバーレスで完全に伸縮自在なファイルストレージ
あるEC2インスタンスのAMIを作成→AutoScalingで増やすみたいな構成の時
EC2にアタッチされているEBSボリュームをルートボリュームとして設定することでEBSのデータも複製することが可能
API Gatewayについて
Amazon API Gateway を利用すれば、デベロッパーは規模にかかわらず簡単に API の作成、公開、保守、モニタリング、保護を行えます。
API Gateway では、トラフィック管理、CORS サポート、認可とアクセスコントロール、スロットリング、モニタリング、API バージョン管理など、最大数十万規模の同時 API コールの受け入れと処理に伴うすべてのタスクを取り扱います。
お支払いいただくのは、受け取った API 呼び出しと送出したデータ量の分だけです。
利点
- 効率的な API 開発:複数のバージョンのAPIを管理することが可能
- 規模に応じたパフォーマンス:CloudFrontと相性〇
- 大規模なコスト削減:APIリクエスト単位で段階的に課金(max 0.90USD/100万リクエスト)
- 簡単なモニタリング:ダッシュボードで監視することが可能
- 柔軟なセキュリティ管理:IAM, Cognitoを使うことで認証を管理することが可能
- RESTful API オプション:HTTP API or REST APIを作成可能
HTTP APIとは
- 機能を絞る代わりに、REST APIに比べて低コスト低レイテンシで実現できるAPI
- 呼び出し先はLambdaプロキシ、もしくはHTTPプロキシのみ設定可能
- 認証はOpenID Connect、OAuth2.0のJWTでの認証のみサポート
Lambdaについて
Lambda関数はLambda専用のセキュアなVPCに配置される
このLambda専用のVPCからは、インターネットにのみアクセスすることが可能である
そのためパブリックサブネット内のAWSリソースにはインターネット経由でアクセス可能であるが、プライベートサブネット内のAWSリソースへのアクセスはできない。
直接AWSリソースにアクセスさせたい場合は、VPCアクセスの設定を行うことでLambdaがHyperplane Elastic Network Interface(ENI)を作成し、ENI経由でアクセスすることが可能となる
ENIはサブネット毎に作成される
ただしENIを作成したLambdaはインターネットへ直接アクセスすることができなくなる
(サブネット内のNATにアクセスさせることでアクセスすることは可能)
SQSについて
キューの種類
- 標準キュー
- 無制限の数の1秒当たりのトランザクションをサポート
- 順序はベストエフォート
- 少なくとも1回はメッセージが配信され、重複することもある
- FIFOキュー
- 1秒当たりバッチ処理なしで300件、バッチ処理で3000件、高スループットモードだと7000件(バッチ:最大10件、256KBのメッセージをまとめて送れる)
- 順序が厳密に保持される(FIFO)
- メッセージの重複は起きない
厳密にしたい場合はFIFO、高スループットを求めるときは標準って感じかな?
メッセージの取得方法について
- ショートポーリング
- ロングポーリング
キュー内にメッセージが存在しない時の挙動が異なる。
ロングの場合は、設定されたタイムアウトのギリギリまでメッセージを返さない、ショートはすぐ返す
→ショートの場合はAPIの呼び出し回数が多くなる。基本的にはロングにした方がよい。
例外として、複数のキューを1つの処理で扱うときなどは、すぐに次のキューを見に行った方が良いため、ショートが使われる。
セキュリティについて
アクセスはIPアドレスや時刻で制御することが可能
また、KMSで管理された鍵を使って、メッセージの内容を暗号化することも可能。
可視性タイムアウトについて
キュー内のメッセージは削除指示を受けた場合に削除される。
そのため、1つのリソースがメッセージを受け取って処理している間に、他のリソースが同じメッセージを受け取ってしまうという懸念がある。
それを解決するため、一定期間はそのメッセージを受け取ることができないようにしている。
デフォルトは30秒、最大12時間。
メッセージの配信遅延について
- 遅延キュー
- すべてのメッセージで、メッセージが追加されてから取得できるまでの遅延時間を生じさせる
- メッセージタイマー
- 個別のメッセージで、メッセージが追加されてから取得できるまでの遅延時間を生じさせる
SQS + Lambda
LambdaのトリガーにSQSを設定することで、LambdaがSQSをポーリングしてくれる