nokoのブログ

こちらは暫定のメモ置き場ですので悪しからず

AWSCertifiedDeveloper-Asociate取得に向けて勉強したこと

はじめに

AWSCertifiedDeveloper–Associate取得に向けて勉強したことのメモです。

やったこと

  • whizlab

メモ

Cloud Front

  • Lambda@Edge
    • Lambda@Edge とは、AWS Lambda の拡張機能で、CloudFront が配信するコンテンツをカスタマイズする関数を実行できるコンピューティングサービスです。
    • 今回のケースならば、オリジンリクエスト をトリガーに Lambda@Edge 関数を実行させて、オブジェクト指定のない URL (末尾が "/" で終わっている)アクセスを、index.html を付与した URL パスに書き換えて S3 オリジンにリクエストするようにしてしままえば良い、ということです。

Route53

  • GSLB
    • GSLBとは、その名の通り地域的に離れたサーバーへ負荷分散する仕組みです。
    • 通常のロードバランサーは、同じ建物やラックの中で負荷分散をしますが、GSLBでは東京リージョンとシンガポールリージョンなど地域をまたいで負荷分散することができます。
    • Amazon Route 53では、名前解決に重み付けをする形でGSLBを実現しています。

EC2

  • EBS暗号化
    • 何に対して暗号化されるのか
    • -> ドキュメントには以下のタイプが暗号化されると書いています。
      • ボリューム内の保存データ
      • ボリュームとインスタンスの間で移動されるすべてのデータ
      • ボリュームから作成されたすべてのスナップショット
      • それらのスナップショットから作成されたすべてのボリューム

ELB

  • ELBだけではなく一般的なロードバランサは、アクセスされたHTTP内のCookieを見て、特定のクライアントからのアクセスは常に同じサーバに返すSticky Session と呼ばれる仕組みが用意されています。

Elastic Beanstalk

  • 移行
    • オンプレからのコンテナ移行も、EC2よりこっちがラク
    • コンテナじゃないがEBのデフォルトのAMIだとハマらないとき
      • カスタムプラットフォームにより、Elastic Beanstalk に最適な独自 AMI を容易に作成することが可能となりました。簡単に言うと、ベースとなる AMI から Packer を使って、Elastic Beanstalk に最適な AMI(カスタムプラットフォーム)を作成してくれます。
      • (参考)Packer とは
        • サーバーイメージを作成するためのツールです
        • AWSであればAMI、Azureであれば arm を作成します
        • Vagrant を開発している HashiCorp社 が開発しているツールなので使用感は Vagrant と同じような感じです
        • 構築済みのサーバーイメージをAMIとして作成しておき、これをベースとしてインスタンスを立ち上げるのはよくあるパターンだと思います
        • ※ "ゴールデンイメージ" というインフラパターンらしいです
        • ただ、このAMIがどうやって作られたか?がわからなくなりがちなのですが、Packerを使うことでAMI構築手順を全てコード化することができます
  • 設定ファイル
    • EB CLI の eb config コマンドを使用して設定をダウンロードできます
    • S3に設定ファイルを保存
    • .ebextensionsはElastic Beanstalkの設定ファイル...ではなく設定ファイル群を格納するディレクトリです。
      • .ebextensionsはElastic Beanstalkの設定ファイル...ではなく設定ファイル群を格納するディレクトリです。
  • デプロイ
    • 従来のElastic Beanstalk アプリケーションのデプロイは 既存のインスタンスに対し上書きされる形で実施されていたため、デプロイ中にサービス影響が及ぶなどの 問題になる事がありました。
    • 新たに追加されたデプロイメントポリシー「immutable」、AWSの日本語コンソール上で 「変更不可」と表示されているポリシーを利用すると、 新しいバージョンのアプリケーション環境用として新規のEC2インスタンスが用意され、 クリーンな環境に対するデプロイが実施されるようになりました。
    • blue/greenも可能
    • ローリングデプロイの仕組み
      • バッチを処理する際、Elastic Beanstalk はバッチ内のすべてのインスタンスロードバランサーからデタッチし、新しいアプリケーションバージョンをデプロイしてから、再アタッチします。
      • Connection Drainingが有効になっていると、Elastic Beanstalk は、デプロイを開始する前に、Amazon EC2 インスタンスから既存の接続をストリーミングします。
  • ライフサイクル
    • Elastic Beanstalk コンソールまたは EB CLI を使用して新しいバージョンのアプリケーションをアップロードするたびに、Elastic Beanstalk はアプリケーションバージョンを作成します。
    • 使用しなくなったバージョンを削除しないと、最終的にはアプリケーションバージョンクォータに到達し、そのアプリケーションの新しいバージョンを作成できなくなります。

Lambda

  • ログ
    • ログはCloudWatchLogsで確認
  • バージョニング
    • バージョニングは基本的には直線の形で更新されていき、過去のバージョンについてはエイリアスという機能を使って別名を与えることができます。
    • 各バージョンのスクリプトにはそれぞれARNが割り当てられます。
    • バージョンは一度発行された後、そのARNが指し示す内容の変更はできませんが、一方でエイリアスは指し示すバージョンを自由に変更することができるという特徴を持っています。
    • このため、エイリアスが指し示すスクリプトは様々なバージョンのものに変更可能となっています。
    • エイリアスを利用すると、開発ワークフローに合わせたバージョンの切り替えが可能となります。
    • 例えば、本番環境用にエイリアスを安定した古いバージョンに設定しておき、ある程度開発やテストが進んだ段階で新しい安定バージョンのものに切り替えるといったことが可能になります。
  • 環境変数
    • 環境変数を使用して、シークレットを安全に保存し、コードを更新することなく関数の動作を調整できます。
    • functionは一つで、環境変数で使い分ける
  • ベストプラクティス
  • 関数
    • イベントをトリガーに、handler関数が呼ばれる
  • VPC
    • LambdaをVPC内に配置すると、Lambda実行時にENI(仮想ネットワークインターフェース)が付与されるようになります。それに伴い考慮すべきことがあります。
      • セキュリティグループ
      • サブネット
  • Kinesis Data Firehose
    • Kinesis Data Firehoseでは、Lambda 関数を呼び出して、受信した送信元データを変換してから送信先に配信できます
  • 実行時間
    • デフォルト3秒だが変えられる
  • リトライ
    • アプリ側でリトライの実装したり
    • Lambda関数には呼び出しタイプ(同期、非同期、ストリーム)があるのですが実行トリガーによって呼び出しタイプが異なり、それによってAWS側でリトライが実行されるのか、ユーザー側でリトライを実装する必要があるかが変わってきます。
  • エラー監視
    • LambdaにDLQを設定することにより、呼び出し元に成功応答しか返さない非同期呼び出しの場合でも、関数実行の失敗をSQS queueやSNS topicに送信してエラー監視をできるようになる!
    • CloudWatchLogsに書き込むためのIAM Roleが必要
  • SAM
    • AWS Serverless Application Model (以降 AWS SAM) は、AWS が公式で提供しているサーバーレスアプリケーションを構築するためのフレームワーク (モデル) です。
    • Lambda, API Gateway, DynamoDB のリソースをひとまとめに管理 (作成 / 更新 / 削除) することができます。
    • AWS SAM は AWS CloudFormation の拡張である
    • パッケージ
      • パッケージは、Lambda ファンクションの Zip ファイルを S3 バケットにアップロードすることを指します。
      • AWS CLI の CloudFormation の package コマンド を叩くだけで、コマンドを実行したディレクトリにある Zip ファイルをアップロードすることができます。
      • functionとyamlはrootディレクトリにおく
    • サーバーレスアプリケーションを段階的にデプロイする
      • AWS SAM を使用してサーバーレスアプリケーションを作成する場合、CodeDeploy が組み込まれているため、Lambda を安全にデプロイできます。わずか数行の設定で、AWS SAM によって以下の処理が実行されます。
      • Lambda 関数の新しいバージョンをデプロイし、新しいバージョンを参照するエイリアスを自動的に作成します。
      • 期待どおりに動作するか、更新をロールバックするまで、顧客のトラフィックを徐々に新しいバージョンに移行します。
      • 事前トラフィックおよび事後トラフィックのテスト関数を定義して、新しくデプロイしたコードが正しく設定されていること、およびアプリケーションが期待どおりに動作していることを確認します。
      • CloudWatch アラームがトリガーされた場合は、デプロイをロールバックします。
    • デプロイ
      • サーバーレスアプリケーションを段階的にデプロイする
        • Canary10Percent10Minutes, など
          • 顧客トラフィックの 10% がすぐに新しいバージョンに移行しています。10 分後、すべてのトラフィックが新しいバージョンに移行されます。
      • デプロイパッケージのサイズ
        • Java または .NET Core で作成した関数の場合は、デプロイパッケージの一環として AWS SDK ライブラリ全体をアップロードしないようにします。
        • 代わりに、SDKコンポーネントを必要に応じて選別するモジュール (DynamoDB モジュール、Amazon S3 SDK モジュール、Lambda コアライブラリなど) を使用します。

API Gateway

  • セキュリティ
  • バージョン管理
    • API Gatewayには1つのAPIを複数のステージにデプロイし、エンドポイントを複数作成することができます。
    • Lambda関数も1つの関数で複数のバージョンを持つことができます。
    • また、バージョンと対応するエイリアスを設定することができます。
    • 例としては、バージョンを1, 2のような形で作成していき、そのバージョンと紐づくdev, prodエイリアスを設定する事ができます。
    • また、$LATESTというバージョンが常に最新の状態を指しているため、devエイリアスを$LATESTに当てることも多いです。
    • API GatewayのstageVariablesを使って、LambdaのAliasと連携させる
      • LambdaとAPI Gatewayをセットで使う場合、両サービスはそれぞれに状態を持っている(LambdaはVersionとAlias、API GatewayはDeployment Stage)為、それらの関連性を管理する必要があります。
      • 具体的には、API Gatewayのdevステージでは、Lambda functionのdevエイリアスを使うなど、自分たちである程度ルールを作り運用することができれば、開発が捗りそうです
      • そんな時は、API Gatewayの${stageVariables}を使って、両者の関係を紐付けることができます。
    • 環境だけでなく、バージョンも下記
      • API ステージ
    • ステージ変数は、次の例に示すように、HTTP 統合 URLの一部として使用できます。
    • API (例: 'dev'、'prod'、'beta'、'v2' など) のライフサイクル状態への論理的な参照。API ステージは API ID とステージ名によって識別されます。
  • Lambdaへの連携
    • Integration Requestで、APIから渡ってきた値をLambdaに渡せるように設定する
    • APIから渡ってきた値をLambdaに渡すために、リクエストテンプレートを設定する
  • DynamoDBへの連携
    • AWS Service Proxy を使い、API Gateway から DynamoDB にアクセスする ということを行ってみたいと思います。
    • APIGateway + Lambda + DynamoDB はよく見かける構成ですが、今回は Lambda レス というところがポイントです。
  • Method Request
    • (参考)Method Requestとは
      • (参考)https://wa3.i-3-i.info/word11405.html
      • リソースに対して実行したいアクションを示す一連のリクエストメソッド
      • ホームページを見るソフト(Webブラウザ)からホームページのファイルが置いてあるコンピュータ(Webサーバ)に対して出されるお願いの種類
        • 1.GET:ページをくれよ(HTTP1.0/1.1)
        • 2.POST:このデータをくれてやるよ(HTTP1.0/1.1)
        • 3.PUT:このデータ(ファイル)をくれてやるよ(HTTP1.0/1.1)
        • 4.DELETE:このデータを消しちゃって(HTTP1.0/1.1)
        • 5.HEAD:ヘッダ情報だけくれ(HTTP1.1)...
      • HTTPリクエストは3つの部品から成り立っています。
        • 「リクエストライン」「ヘッダ」(空行【CR+LF】)「メッセージボディ」
    • Method Requestで、許可するパラメータ、リクエストヘッダーを登録する
    • その中からMethod Requestを選択して、
      • Query String Parametersにpathを登録
      • Request Header に Content-Typeを登録する

CloudWatch

  • 解像度
    • 既存の PutMetricData API を使用して、カスタムメトリクスを 1 秒の解像度まで発行することができます。
  • エラー
    • 429 Too Many Requestsがでたときは下記を実装する
      • 単純な再試行に加えて、各 AWS SDK は効果的なフロー制御を行うために、エクスポネンシャルバックオフアルゴリズムを実装します。
      • エクスポネンシャルバックオフは、再試行間の待機時間を累進的に長くして、連続的なエラー応答を受信するという考えに基づいています。

S3

  • マルチパートアップロードAPI
  • CORS
    • CORS(Cross-Origin Resource Sharing)は、その名の通り、ブラウザがオリジン(HTMLを読み込んだサーバのこと)以外のサーバからデータを取得する仕組みです。
    • S3をオリジンWebサイトとして運用している場合は、EC2側でCORS設定を行う事で、S3とEC2のドメインが異なっていたとしてもAjax内で呼び出しができるようになります。
    • S3側で設定することも
  • バケットポリシー
    • バケットポリシーで x-amz-server-side-encryption ヘッダーのチェックを行えば、S3 へのオブジェクト保存時に暗号化を強制することができます。
  • Webサーバ
    • 静的なコンテンツはS3だけでよい
  • パフォーマンス
    • GETリクエストが多い場合は、S3バケット前にCloudfrontでキャッシュしてバケットへのリクエストを減らす
    • ハッシュ文字を使用してプレフィックス命名のランダム化は必要なくなった(2018年7月頃)
    • アプリケーションでバケット内のプレフィックスごとに 1 秒あたり 3,500 回以上の PUT/COPY/POST/DELETE リクエストまたは 5,500 回以上の GET/HEAD リクエストを達成できます。
      • -> バケット内のプレフィックスの数に制限はありません。読み取りを並列化することによって読み取りまたは書き込みのパフォーマンスを向上させることができます。
      • -> たとえば、Amazon S3 バケットに 10 個のプレフィックスを作成して読み取りを並列化すると、読み取りパフォーマンスを 1 秒あたり 55,000 回の読み取りリクエストにスケールできます。

RDS

  • 暗号化
    • Amazon RDS は、透過的なデータ暗号化 (TDE) を使用して、Microsoft SQL Server を実行する DB インスタンスのデータの暗号化をサポートします。
    • TDE は、ストレージへの書き込み前に自動的にデータを暗号化し、ストレージからのデータの読み取り時に自動的にデータを復号します。
  • リードレプリカ
    • 「リードレプリカ」とは、読み出し専用のDBで、レプリケーション機能でマスターDBから作成されたレプリカ(複製)DBのことです。
    • 読み込み専用なのでDBへの書き込みやマスターDBへの反映は行われませんが、複数のリードレプリカDBを作成することができます。
    • リードレプリカを使用する最大のメリットは、柔軟にスケールアウトが実現できる点です。
    • 非同期レプリケーション:マスターDBとリードレプリカは非同期なので、同期のタイミングに注意が必要。トラブル時に最新の変更が残らない可能性あり。
    • 準同期レプリケーション:マスターDBを更新すると、変更点がスレーブに転送される。このときの転送待ちにより処理速度が低下する可能性あり。
    • ユースケース
      • レポーティングのアプリなどで使ったり

DynamoDB

  • DAX
    • DAXはDynamoDBのメモリキャッシュサービスで、アプリ開発者がキャッシュのクリアを気にすること無く利用できるとされるサービスです。
    • 書き込みよりも読み込みの多いテーブルがあれば、プロビジョニング済みキャパシティを減らすことができるので、コスト削減を見込めます。
    • DynamoDBの前にインメモリ型キャッシュクラスタを組み込んで管理する必要があり、そのためにはアプリケーションをリライトし、クラスタを実装、運用する専門的なスキルが求められるといった課題があった。
  • ユースケース
    • ユーザセッション管理といえばこれ
  • キャパシティ設計
    • 読込キャパシティーユニットで、最大サイズ 4KB の項目について、1秒あたり1回の強力な整合性のある読み込み 又は 1秒あたり2回の結果整合性のある読み込みが可能
    • DynamoDBでは読み込みと書き込みのキャパシティをそれぞれユニットと呼ばれる単位で設定できる。
      • 1ユニットの性能は以下である。
        • 書き込み(WCU):1秒間に最大1KBのデータを1回書き込むことが可能
        • 読み込み(RCU):1秒間に最大4KBのデータを2回読み込むことが可能
      • なお、強い整合性の読み込みを利用すると、 2回が1回に半減する。
  • DynamoDB Streams
    • ほぼリアルタイムでDynamoDBになされた更新をストリーミング的に受けられる機能がある
    • DynamoDB Streamを使うことで、項目が追加・変更された時にプッシュ通知を飛ばしたりといった実装が可能になります。今回は、そのイベントをLambdaで受け取ってみたいと思います。
  • 読み込みアクティビティの急激な増大 (スパイク) を回避する
    • scan
    • ページサイズを小さくする
    • スキャンオペレーションではページ全体(デフォルトでは 1 MB)を読み込むため、設定するページサイズを小さくすることで、スキャンの影響を軽減させることができます。
  • Global Tables
    • https://qiita.com/blackcat5016/items/c2af7d3d55093134bac3
    • 別リージョンにテーブルの複製を作成して、最終的に同期してくれる機能。ただし、さすがにタイムラグがあるため、テーブルに強い整合性の読み取りを設定していても、リージョン間では結果整合性となる。書き込みに関しても最終的には更新時刻の遅いほうが適応される。
    • -> 一時的であるがリージョン間で不整合が発生することはあり得るということを意識しないといけない。
    • また制約として「空のテーブルである」ということが必要であり、後から変更することができないので、最初の設計が大事である。なお、もう一つの要件として「DynamoDB Streamsを有効化する必要あり」があるが、つまり、裏ではStreamsを利用して別リージョンのテーブルに変更を加えるだけと予想される。(それでも自分で設定しなくてよくて助かるのだが。。。)
  • 並列スキャン
    • 複数のワーカースレッド/プロセスを同時に実行し、各ワーカーはテーブルの別のセグメントを他のワーカーと同時にスキャンすることができます。

SQS

  • キューからのメッセージを処理するプロセスは、ショートポーリング使用するか、ロングポーリングを使用するかによって異なります。
  • Amazon SQS はデフォルトでショートポーリングを使用して、サーバーのサブセットだけに対して (重み付けされたランダム分散に基づいて) クエリを実行し、レスポンスに利用できるメッセージがあるかどうかを調べます。
  • ロングポーリング を使用すると、コンシューマーがキューに到着するとすぐにメッセージを受信できるようにすると共に、コストを削減できます。
  • Long polling
    • キューが空の時、ポーリング間隔を最大20秒にする。(不必要なポーリングを減らすことで、コストを最小限に抑える)
  • 空なことが多いなら、無駄な負荷下げるために設定しておく
  • FIFOキュー
    • SQSは高可用性を持った分散キューシステムですので、1つのエンドポイントに投げられたメッセージは複製され蓄積されます。そのため、メッセージを取り出した際に、一番古いキューデータを取るとは限りませんでした。メディアエンコーディングであれば実行順番は関係ありませんが、商品をカートに入れて購入して配送といった順番を持つことが必須のワークフローではキューの活用は難しかったです。
    • -> FIFOキュー
      • 順番が保証されます
      • 複数回実行されません
      • 間違って同じ呼び出しをしたら削除します
    • 後から変更はできない。作る時から。

Cognito

  • 自社でもっている認証基盤に対して、ユーザーIDとパスワードを使ってログインしてもらう という方式があります。AWS においては Amazon Cognito がその要件をかなえる筆頭サービスです。
  • Amazon Cognito ユーザープールは、何億人ものユーザーにスケールするセキュアなユーザーディレクトリを作成できます。
  • Amazon Cognito を使用すれば、GoogleFacebookAmazon などのソーシャル ID プロバイダーや、SAML による Microsoft Active Directory などのエンタープライズ ID プロバイダーを通してサインインすることができます。
  • Amazon Cognito は、お客様のアプリのバックエンドリソースに対するアクセスをコントロールするソリューションです。ロールを定義してユーザを異なるロールにマッピングすることで、各ユーザに対して許可されているリソースにのみアプリがアクセスできるようにすることができます。
  • Amazon Cognito ID プールは、AWS リソースにアクセスするための、権限が制限された一時的な認証情報を、認証されたユーザーに割り当てます。各ユーザーの権限は、作成する IAM ロールを介して制御されます。ユーザーの ID トークンのクレームに基づいて、各ユーザーのロールを選択するルールを定義できます。認証されたユーザー用のデフォルトのロールを定義できます。また、認証されていないゲストユーザーの制限付き権限を持つ別の IAM ロールも定義できます。
  • ルールは順に評価され、順序をオーバーライドするために CustomRoleArn が指定されない限り、最初の一致するルールの IAM ロールが使用されます。
  • Amazon Cognitoではユーザー認証機能だけでなく、ユーザデータの保管が可能な同期ストアが提供されます。
  • 先日リリースされたAmazon Cognitoストリームを利用する事で、Cognito同期ストアの更新情報をKinesisに流し込む事が可能になりました。
  • ロールの割り当て
    • トークンを使用してロールを割り当てる際に、ユーザーに割り当てることができる複数のロールがある場合、Amazon Cognito ID プール (フェデレーテッドアイデンティティ) は次のようにロールを選択します。
      • 設定されていて、cognito:roles クレームのロールに一致する場合は GetCredentialsForIdentityCustomRoleArn パラメータを使用します。このパラメーターが cognito:roles のロールと一致しない場合は、アクセスを拒否します。
      • cognito:preferred_role クレームが設定されている場合は、それを使用します。
      • cognito:preferred_role クレームは設定されずに、cognito:roles クレームが設定されている、GetCredentialsForIdentity への呼び出しで CustomRoleArn が設定されていない場合は、コンソールまたは AmbiguousRoleResolution フィールドの [ロールの解決] 設定 (SetIdentityPoolRoles API の RoleMappings パラメータ) を使用して、割り当てるロールが決定されます。

STS

  • AWS Security Token Serviceの略称で、一時的な認証情報を発行します。
  • 発行される認証情報は、「アクセスキー」、「シークレットキー」、「セッショントークン」の3つが発行されます。
  • スイッチロールの際にもSTSを使用してスイッチ先の各種リソースにアクセスしてるので、認証情報さえ取り出せばうまいことアクセスキーが使えそうですね。
  • 「AssumeRoleはRoleArnを入力するとCredentialsを返すAPI

ElastiCache

  • https://dev.classmethod.jp/articles/elasticache-is-very-good-lets-review/
  • ElastiCacheはデータをノードのメモリに保存するので非常に高速でデータの出し入れが可能です。ですがメモリにデータを保存しているのでノードが落ちてしまう(再起動を含む)と中のデータが無くなってしまいます。なのでElastiCacheには無くなっても良いデータを保存するようにしましょう。
  • セッション情報をElastiCacheに保存してサーバがスケールしても共通のセッション情報を参照できるようにしたり、データストアに保存したデータをElastiCacheに保存してアプリケーションのキャッシュとして利用したりしましょう。
  • キャッシュは揮発性のあるデータです。消えてしまうと大変なデータの保存は避けて、キャッシュにデータが無いならデータストア(DBなど)を参照しにいく設計が良いでしょう。
  • 最近ElastiCacheのアップデート(機能追加や改善)はRedisの方が多いです。いろんな機能を利用したい場合にはRedisを選択して、単一ノードの性能を上げたい場合にはMemcachedを利用すると良いでしょう。
  • DynamoDBじゃダメ?
    • ElastiCacheに比べるとやや書き込みが遅くなります
    • 高速な通信がしたい、保存するデータは書き込みと読み込みが頻繁に発生するためコストが心配
      • ->ElastiCache
    • データの永続化がしたい
      • ->DynamoDB
  • ユーズケース
    • ElastiCacheの用途として、RDSと併用して、RDSへのクエリ結果をElastiCacheにキャッシュさせ、
      • キャッシュがある場合はElastiCacheのキャッシュを使う
      • キャッシュが無い場合のみRDSにDBアクセス
    • session state
      • HTTPプロトコルはステートレスなので、そのままではデータや状態を次のHTTPセッションに引き継げません。このままでは掲示板や商品購入や支払い機能を作れないので、何らかの形で状態を維持するしくみが必要です。
    • Amazon ElastiCache for Redis でリアルタイムゲームリーダーボードを構築する
  • AWSでは、RDSのクエリ結果をキャッシュとして利用する方法は2種類ある
    • Lazy Loading(遅延読み込み)
      • キャッシュ有効期限が切れるまで古いキャッシュを読み込んでしまう
      • キャッシュミス時にElastiCache, RDSとのやり取り回数が3回に増え、server <-> clientへのレスポンスが悪くなる
    • Write Through(ライトスルー, 書き込みスルー)
      • 読み込まれない無駄なデータがキャッシュされる可能性がある

Kinesis

  • Kinesisストリームの暗号化は大きく以下の2方針があります。
    • サーバーサイド暗号 : Kinesisストリームがストレージに保存・取り出すタイミングで暗号・復号
    • クライアント暗号 : Producerが暗号化したデータをKinesisストリームにPut。ConsumerがGetしたデータを復号
  • パーティションキー
    • 例えば、2 つのシャード (シャード 1 とシャード 2) で構成されるデータストリームがあるものとします。2 つのパーティションキー (キー A とキー B) を使用し、キー A のレコードはすべてシャード 1 に追加され、キー B のレコードはすべてシャード 2 に追加されるように、データプロデューサーを設定できます。
  • Firehose
    • S3に直接入れたかったら、Firehose

Codeシリーズ

  • CI(継続的インテグレーション)を行うためのサービスです。
  • アプリケーションのコンパイルやテスト、デプロイなどを自動化することができます。
  • ソースコードのトップディレクトリにbuildspec.yml を設置しておくことでビルド時に実行してくれます。
  • ユーザがプロジェクトにアクセスできないようにしといて、これだけ返信させる
  • 上書きするには
    • 別のビルド仕様を使用するには、[Override build specification (ビルド仕様の上書き)] を選択します。
  • AWS CodeStar
    • 一言で言えば、CodeCommit, CodePipeline, CodeBuild, CodeDeployとそれらに付随する実行環境を一撃で構築・管理できます
    • AWS CodeStarが何者か、一言で言えば、一時期に流行ったスキャホールドの類です。
    • ベース部分をスキャホールド(足組)として作り、肉付けをしていくというスタイルが流行ったかと思います。
  • AppSpec file
    • Application Specification File (AppSpec file) は、CodeDeploy があなたの EC2 インスタンスに対して、Amazon S3 または GitHub にあるアプリケーションのリビジョンをどのようにインストールするか決定する、YAML フォーマットのファイルです。また同様に、デプロイの様々なライフサイクルイベントをフックして処理を実行するか決定します。
    • AppSpec ファイルの名前は必ず appspec.yml とし、ルートディレクトリに配置しておかなればいけません。この要件を満たしていない場合、デプロイは失敗します。
    • また、AppSpec ファイルが存在する場合は、これを含めたデプロイ用のコンテンツを .zip (Windows Server 以外は .tar および .tar.gz も可能) 形式の圧縮ファイルにすることができます(詳しくは Prepare a Revision を参照)。

KMS

  • https://dev.classmethod.jp/articles/10minutes-kms/
  • マスターキーとデータキー
  • 解決策は、鍵の鍵をどこか安全な場所に保管することです。この「安全な場所」がAWSです。
  • なお、KMSでは、鍵の削除はサポートしていません。マスターキーを削除すると、マスターキーで暗号化したデータキーで暗号化したデータ(ややこしいですね)を復号できなくなってしまうためです。
  • 暗号化されていないデータキーは、暗号化/復号に使ったら、すぐに捨てましょう
  • クォータ
    • KMS APIにはクォータあり

WAF

  • AWS WAFで作成できるルールは4種類に分けられます。
    • IP制限
    • レートベース
    • 特定の脆弱性に関するルール
    • 悪意のあるhttpリクエストかを確認するルール

Secrets Manager

  • AWSのParameter StoreとSecrets Manager、結局どちらを使えばいいのか?
    • シンプルな3-Tierの小規模WebシステムやDWH等、DBへの接続情報がプーリングされ、パラメータへのアクセスが少ない環境であれば、アプリの利用する情報の外部化にはParameter Storeの利用がコスト的にもリーズナブルである。
    • パラメータやシークレット情報に対するスパイクアクセスが予想されるEC2やECSのAuto Scaling環境、Labmda等では、Parameter Storeではパラメータ情報取得のAPIリクエストを捌ききれない可能性がある。
    • シークレット情報の取得リクエストが700 Req/secに収まるのであれば、Secrets Managerを試してみる価値あり。ただし有料なのでコスト試算を。

X-Ray

  • 今まで AWS Lambda のパフォーマンス解析を行う時、CloudWatch やログ出力の実装である程度可能でしたが、あくまでもある程度の解析しか行うことができませんでした。
  • -> それが今回のアップデートにより、AWS X-Ray により AWS Lambda のパフォーマンス解析を詳細に行うことができるようになりました。
  • AWS X-Ray サポートにより、Lambda ファンクションのオーバーヘッド、初期化(コールドスタート)、処理実行時間を計測できるようになり、AWS Lambda 側なのか、ソースコード側なのか、ボトルネックを特定できるようになりました。
  • EC2インスタンス上で動作するアプリケーションも

IAM

  • ウエブ ID フェデレーション
    • ウェブ ID フェデレーションを使用すると、カスタムサインインコードを作成したり独自のユーザー ID を管理したりする必要はありません。
    • その代わりに、アプリのユーザーは、よく知られている外部 ID プロバイダー (IdP) (例: Login with AmazonFacebookGoogle などのOpenID Connect (OIDC)互換の IdP) を使用してサインインすることができます。
    • 認証トークンを受け取ったら、そのトークンを AWS アカウントのリソースを使用するためのアクセス許可を持つ IAM ロールにマッピングし、AWS の一時的セキュリティ認証情報に変換することができます。
    • IdP を使用すると、アプリケーションで長期的なセキュリティ認証情報を埋め込んで配布する必要がないため、AWS アカウントの安全性の維持に役立ちます。