はじめに
AWS認定デベロッパーアソシエイト取得に向けた学習ログです。
学習期間
2020年8月3日~8月9日
学習ログ
リソースの供給と需要を適切に一致させる拡張性の高いアーキテクチャ
- 要件
- 以下が必要
- 1つのDB
- 1つのサーバ
- 実現方法
- DynamoDBのオートスケーリング
- 負荷に応じて、write capacity unitsと、read capacity unitsのスループットを上下できる
- 参考
- EC2フリート
- EC2 fleet(EC2の艦隊)
- Spot fleetとは、Spotインスタンスの買い方の1つ
- これくらいのメモリ、インスタンスサイズ、価格、という条件を指定しておくと、AWSがSpotインスタンスの価格を監視する
- 条件にあったEC2を見つけて起動
- 使いたい価格より高くなったEC2は自動で破棄してくれる
- EC2フリート+AutoScaling
- EC2、ECS、SQSのメトリクスと連動できる
- EC2のCPU使用率に基づいて、EC2の数を自動で上下
- 参考
- EC2、ECS、SQSのメトリクスと連動できる
- DynamoDBのオートスケーリング
- 注意点
- RDSのAutoScalingは適さない
- RDS Storage Auto Scaling
- データ容量を増大させる仕組みであり、パフォーマンスをスケーリングするものではない
- 参考
- RDSのAutoScalingは適さない
AWS Certificate Managerが利用できない場合にSSL/TLS証明書を安全にインポートする
- ACMがサポートされているリージョン
- ACMを使って、SSL/TLS証明書を入れる
- ACMがサポートされていないリージョン
- IAMを利用する
- 証明書マネージャーとして利用できる
- IAMを利用する
# 証明書のアップロード $ aws iam upload-server-certificate --server-certificate-name ExampleCA --certificate-body file://Certificate.pem --certificate-chain file://CertificateChain.pem --private-key file://PrivateKey.pem # アップロードした証明書の表示 $ aws iam list-server-certificates
非同期実行するLambda関数が失敗したときの設定
- Lambda関数
DeadLetterConfig
パラメータを設定する- SQSのARNを指定する
- Lambda関数が失敗した場合、SQSキューに送信する前に、Lambda関数を2回再試行することができる
- 非同期呼び出しが3回とも失敗した場合、SQSキュー、SNSトピックにイベント送信できる
- DeadLetterQueueを指定しない関数は、イベントを破棄する
"DeadLetterConfig": { "TargetArn": "arn:aws:sns:us-east-2:123456789012:failed-lambda" }
SQSメッセージを指定された期間、コンシューマーに見せないようにする設定
- 遅延キュー を使う
- キューへの新しいメッセージ配信を数秒延期できる
- デフォルト遅延は0秒
- 最大15分
- キューへの新しいメッセージ配信を数秒延期できる
- 類似した機能
- 遅延キュー
- メッセージが最初にキューに追加されたときに非表示になる
- 可視性タイムアウト
- メッセージがキューから処理された後のみ非表示になる
- 遅延キュー
EC2とDynamoDBによるモバイルゲームで、複数モバイルデバイス間でのユーザプロファイルデータを同期したい
- AWS AppSync を使う
- アプリケーション関連のユーザーデータのデバイス間同期ができる
- Cognito Syncでも可能だが、現在は、AppSyncの利用が推奨されている
Amazon Cognito Sync を初めて使用する場合は、AWS AppSync を使用してください。AWS AppSync は、Amazon Cognito Sync のように、デバイス間でアプリケーションデータを同期するための新しいサービスです。
- AppSyncとは
- サーバレスの形で、GraphQLのバックエンドを実装できるサービス
EC2インスタンスのCPU使用率とメモリ使用率を10秒間隔で把握したい
- 実現方法
- CloudWatchのカスタムメトリクスを設定し、高解像度で保存する
- 仕様
- CloudWatchのカスタムメトリクス
- EC2の内部情報は標準では取得できない
- メモリ利用率
- 標準解像度
- 1分間隔でメトリクスを保存(昔は5分間隔だった)
- 高解像度
- 1秒間隔でメトリクスが保存できる
- 1,5,10,30または60秒の倍数で設定できる
- 1秒に設定
- 3時間利用可能
- 60秒に設定
- 15日利用可能
- 1秒に設定
- EC2の内部情報は標準では取得できない
- CloudWatchのカスタムメトリクス
CloudFormationに依存してリソースをプロビジョニングしているサービス
- AWS Elastic Beanstalk
- CloudFormationで環境を作成している
- AWS Step Functions
- 同上
CodeCommitの変更に反応するルールを設定できるAWSサービス
- コードの変更を定期的にCodeCommitにマージ
- CloudWatchイベントを使用する
- CodeCommitの変更をトリガーに、何らかのアクションを実行できるようになる
- CodeCommitのパイプラインなど
- CloudWatchイベントを使用する
- 例)
- masterブランチを含む、mytestRepoリポジトリのCodeCommitイベントパターン
{ "source"; [ "aws.codecommit" ], "detail-type": [ "CodeCommit Repository State Change" ], "resources": [ "arn:aws:codecommit:us-east-2:1234567890example:mytestRepo" ], "detail": [ "referrenceType": [ "branch" ], "referenceName": [ "master" ] ] }
SQSキュー内で指定されたメッセージを削除する仕組み
PurgeQueue
を使用する- キュー内のメッセージを全部消すことができる!
- SQSキューを削除せずに、キュー内のメッセージをすべて削除できる
- SQSキューそのものを削除する場合は、
Delete Queue
を使用する
DynamoDBのデータアクセスが不均等かつ、特定のパーティションに大容量の読み書きトラフィックが発生した際の対処法
- 対処法1
- エラーの再試行と指数バックオフ(Exponential Backoff)を実装する
- 指数バックオフ
- 言葉の意味
- Expornential(指数関数的)
- Backoff(後ずさりする)
- アプリケーションのリトライ間隔を指数関数的に後退させるアルゴリズムのこと
- 指数バックオフを実装することで、一時的にリソース超過したリクエストが来ても、特定のスロットリング機構なしで、リクエストを処理できる
- 言葉の意味
- 指数バックオフ
- エラーの再試行と指数バックオフ(Exponential Backoff)を実装する
- 対処法2
- I/Oリクエストを均等に分散するリファクタリングを実施する
- ホットパーティションが発生しないように、キーを見直す
- I/Oリクエストを均等に分散するリファクタリングを実施する
API gatewayで作成したPublic APIを公開する設定
- API Gateway 使用量プラン を使う
- つながりやすさを、APIキー毎に設定できるようになる
CloudFormationのパラメータ設定セクション
Parameters
セクションにて設定するAWS::EC2::KeyPair::KeyName
AWS::EC2::AvailabilityZone::Name
AWS::EC2::Instance::Id
- などが指定できる
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "hogehogefugafuga", "Parameters": { "AZ": { "Description": "Input AZ", "Type": "AWS::EC2::AvailabilityZone::Name", "Default": "ap-northeast-1" } }, "Resources":{ //作成するリソースを記述 } }
Conditions
セクションは、リソースを作成するかどうかを判断する。if文の条件式みたいなもの。
"Conditions": { "IsProduction": { "Fn::Equals" : [ { "Ref" : "ENV"}, "production" ] } }
Elastic Beanstalkのコスト最適化
- 要件
- DBにRDSを使用
- 再利用したい
- セッション管理にElasti Casheを使用
- デプロイ毎にユーザーセッションデータを再作成
- DBにRDSを使用
- 実現方法
- RDSは外部で定義して、環境変数で参照する
- ElastiCasheは、
.ebextensions/
で定義する
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-environment-resources-elasticache.html/#customize-environment-resources-elasticache-defaultvpcdocs.aws.amazon.com
REST APIAPI Gatewayの統合タイプ
- 要件
- VPCの背後にあるWEBサーバとの連携がしたい
- REST APIでアクセスしたい
- WEBサーバをカスタムデータマッピングを持つAPI Gatewayと統合する必要がある
- 受信リクエストデータがどう統合リクエストにマッピングされるか指定する
- 同等レスポンスデータの結果が、メソッド応答にマッピングされるか指定する
- VPCの背後にあるWEBサーバとの連携がしたい
- 実現方法
- HTTPプロキシ統合 で実現する
- バックエンドが、EC2等で自作したAPIと統合する場合に使用する
HTTP_PROXY
HTTP
- バックエンドが、EC2等で自作したAPIと統合する場合に使用する
- HTTPプロキシ統合 で実現する
- 他の連携方法
- Lambda統合
- バックエンドが、Lambda関数の場合使用する
AWS_PROXY
を選択
- 参考記事
- Lambdaプロキシ統合の無し、有りが選択できる
- 無しの場合
- Lambda側に処理を寄せる方式
- Lambdaから返される値のフォーマットが決まっていない
- Lambdaの戻り値がそのまま使用される
/api-name?id=123
でアクセスした場合event['queryStringParameters']['id']
で、値が取得できない- Lambda関数の引数である、
event
にマッピングされない- 自分でマッピングテンプレートの設定が必要
- Lambdaから返される値のフォーマットが決まっていない
- 有りの場合
- API Gateway側に仕事を担当させる方式
- Lambdaから返される値のフォーマットが決まっている
- 従わない場合は、502エラーになる
/api-name?id=123
でアクセスした場合event['queryStringParameters']['id']
で、値が取得できる- Lambda関数の引数である、
event
にマッピングされる
- バックエンドが、Lambda関数の場合使用する
- Lambdaカスタム統合
AWS
を選択
- モック統合
MOCK
を選択
- Lambda統合
AWS SDK for Javaを使ってオンプレ環境からAWSにアクセスする権限設定
- 開発者に必要なAWSサービスへのアクセス権限を付与したIAMユーザを作成する
- アプリケーションサーバ上で、
~/.aws/credentials
に認証ファイルを配置する
API Gateway+Lambda+DynamoDBが着信トラフィックの急増により504エラーになる原因
- API Gatewayで、INTEGRATION_TIMEOUTエラーが発生している
INTEGRATION_FAILURE
- 504が返る
- 統合が失敗したときのレスポンス
INTEGRATION_TIMEOUT
- 504が返る
- 統合がタイム・アウトした場合のレスポンス
- 参考
- Lambdaが29秒以上実行できず、API Gatewayのタイムアウトエラーが発生している
- 以下、5つのタイムアウト範囲は、50ミリ秒から29秒まで
- Lambda統合
- Lambdaプロキシ統合
- HTTP統合
- HTTPプロキシ統合
- AWS統合
- 以下、5つのタイムアウト範囲は、50ミリ秒から29秒まで
Aurora Postgres クラスタの最適な構成を考える
- 要件
- Productionのトラフィックは、大容量インスタンスが処理
- 社内スタッフのクエリは、小容量インスタンスが処理
- 実現方法
- Auroraで新しいカスタムエンドポイントを作成
- 両方のトラフィックを処理できるようにする
- イメージ dev.classmethod.jp
Lambdaのインライン関数をデプロイするCloudFormationのパラメータ設定
- CloudFormationテンプレートにコードを配置したい
AWS::Lambda::Function
リソースのパラメータ設定を行うZipFile
の中に、直接コードが記載できる
Type: AWS::Lambada::Function Properties: Runtime: nodejs12.x Role: arn:aws;iam;;123456789012:role/hoge Handler: index.handler Code: ZipFIle: | var aws = require('aws-sdk') var response = require('cfn-response') //以下略