AWS SAA受験に向けたAWSサービスとBlackBeltの整理

はじめに

2023年1月にAWS SAAを受験するので、
それに向けてAWSの各サービスとBlackBelt資料の要点について整理します。
AWS BlackBeltとは、AWS公式のオンラインセミナーのことで資料や動画が公開されています。

aws.amazon.com

サービス

AWSの技術カテゴリーごとにサービスを抜粋して整理します。

ネットワーク関連

  • ネットワーキングとコンテンツ配信
    • VPC (Virtual Private Cloud)
    • Route 53
    • ELB (Elastic Load Balancing)
    • CloudFront

リソース関連

  • コンピューティング

    • EC2
    • Batch
  • コンテナ

    • ECS (Elastic Container Service)
    • Fargate
  • ストレージ

    • S3 (Simple Storage Service)
    • EBS (Elastic Block Store)
    • EFS (Elastic File System)

アプリケーション関連

  • データベース

    • RDS (Relational Database Service)
    • DynamoDB
    • ElasticChache
  • ウェブとモバイルのフロントエンド

  • アプリケーション統合

    • SNS (Simple Notification Service)
    • SQS (Simple Queue Service)
  • ビジネスアプリケーション

    • SES (Simple Email Service)
  • サーバレス

    • Lambda
  • 分析

管理関連

ネットワーク関連

ネットワーキングとコンテンツ配信

VPC (Virtual Private Cloud)

AWS_BlackBelt_VPC

  • CIDRのレンジ表記: xxx.xxx.xxx.xxx/xx
  • アベイラビリティゾーン: AZは1つ以上のデータセンターで構成される, 1リージョン内にAZが複数存在
  • サブネット利用できないIPアドレス(/24の例): 0, 1, 2, 3, 255
  • ネットワークACL vs セキュリティグループ:
  • VPCとのプライベートネットワーク: VPN接続 or 専用線(Direct Connect)
  • GuardDuty: 脅威検出

Route53

AWS_BlackBelt_Route53

  • DNSの基本まとめ:
    • DNSサーバー: ネームサーバ, フルサービスリゾルバー, スタブリゾルバー, フォワーダー
    • 問い合わせ: 再帰的, 反復

(その他)

  • レコードの種類: A, CNAME, Aliasなど
  • ルーティングポリシー: シンプル, 加重, レイテンシー, フェイルオーバー, 位置情報, 地理的近接性, 複数値回答
  • ヘルスチェック

ELB (Elastic Load Balancing)

AWS_BlackBelt_ELB

  • ELBの種類:
    • Application Load Balancer (ALB): HTTPS系, Layer7
    • Network Load Balancer (NLB): TCP系, Layer4
    • Classic Load Balancer (CLB): Classicのため通常は新規採用されない
  • ヘルスチェック: 設定値(しきい値など)に基づいてヘルスチェックし、正常なターゲットへのみルーティングする
  • ALBの特徴と機能: 高度なリクエストルーティング
  • NLBの特徴と機能: 暖機なしに急激なスパイクにも対応可能、固定IPが可能
  • Autoscaling, ECS, WAF, Lambdaとの連携
  • NLBはセキュリティグループが設定できない

CloudFront

AWS_BlackBelt_CloudFront

  • 動的コンテンツと静的コンテンツの配信
  • 地域(GEO)制限: BlackList, WhiteListで指定可
  • オリジンサーバの保護: Origin Access Identity(OAI)でS3のBucket へのアクセスをCloudFrontからのみに制限できる
  • WAF連携
  • AWS Shield による DDoS 攻撃対策
  • CloudFrontとLambda@Edgeとの組み合わせ

リソース関連

コンピューティング

EC2

AWS_BlackBelt_EC2

  • AMI
  • Key Pair: OSに対する認証機能
  • Security Group
  • EC2のストレージ: インスタンスストア, EBS
  • EC2の購入オプション: オンデマンド, リザーブド, スポットなど

Batch

AWS_BlackBelt_AWS Batch

コンテナ

ECS (Elastic Container Service)

AWS_BlackBelt_ECS

Fargate

AWS_BlackBelt_Fargate

ストレージ

S3 (Simple Storage Service)

AWS_BlackBelt_S3 Glacier

EBS (Elastic Block Store)

AWS_BlackBelt_EBS

EFS (Elastic File System)

AWS_BlackBelt_EFS

アプリケーション関連

データベース

RDS (Relational Database Service)

AWS_BlackBelt_RDS

DynamoDB

AWS_BlackBelt_DynamoDB

ElasticChache

AWS_BlackBelt_ElastiCache

ウェブとモバイルのフロントエンド

API Gateway

AWS_BlackBelt_APIGateway

アプリケーション統合

SNS (Simple Notification Service)

AWS_BlackBelt_SNS

SQS (Simple Queue Service)

AWS_BlackBelt_SQS

ビジネスアプリケーション

SES (Simple Email Service)

AWS_BlackBelt_SES

サーバレス

Lambda

AWS_BlackBelt_Lambda

分析

Kinesis

AWS_BlackBelt_Kinesis

管理関連

マネジメントとガバナンス

CloudWatch

AWS_BlackBelt_CloudWatch

CloudFormation

AWS_BlackBelt_CloudFormation

セキュリティ、アイデンティティコンプライアンス

IAM

AWS_BlackBelt_IAM Part1 AWS_BlackBelt_IAM Part2

CloudTrail

AWS_BlackBelt_CloudTrail

AutoScaling

AWS_BlackBelt_AutoScaling

SQLチューニング

SQLを速くするぞ

https://mickindex.sakura.ne.jp/database/db_optimize.html

ポイント

  • サブクエリを引数に取る場合、IN述語よりもEXISTS述語を使う
  • BETWEENはおしゃれなアクセサリ
  • EXISTS述語のサブクエリ内では、SELECT * を使う
  • 極値関数でインデックスを利用する
  • 行数を数えるときはCOUNT(*)よりもCOUNT(列名)を使う
  • GROUP BY 句でインデックスを利用する
  • ORDER BY 句でインデックスを利用する
  • UNION、INTERSECT、EXCEPT には ALL を付ける
  • 実はインデックスが使用されていないという罠。
  • 行ポインタによるアクセスが最速
  • ワイルドカードは使わない
  • 列番号は使わない
  • 表に別名をつける
  • 暗黙の型変換を回避する
  • IN述語の引数リストには、最もありそうなキーを左寄せする
  • ビューを濫用してはいけません

実装時のフラグ管理

「フラグが立つ」とよく言われるように、フラグは折るより立てるもの。

実際の実装内容をもとにフェールセーフとして安全側に倒す方がどちらかっていう話はあるけれど、

フラグは立てる側で実装していく方が考慮漏れの不具合を産みにくい。

『システム、オールグリーン!OK!』

人工知能まわりの2022年のトレンド

AI 激動の年!2022年の人工知能10大トレンドと必読論文

https://ja.stateofaiguides.com/20221231-ai-trends-2022/

トレンド

  • Stable Diffusion
    • 「入力されたテキスト」をもとに画像を生成する「訓練済のAIモデル(Diffusion Model)」を搭載した画像生成AI
    • テキストと画像の類似度をとらえる CLIPと、潜在空間上で高解像度・高速な生成を実現する拡散モデルLDMを組み合わせたもの
    • LAION-Aesthetics と呼ばれる「美しい」画像のみを集めたデータセットを用いて訓練されているという特徴がある
  • Whisper
    • 68 万時間もの訓練データで訓練された大規模な音声認識 (ASR; automatic speech recognition) モデル
    • 英語の音声認識において人間の (有料) 書き起こしサービスにも匹敵
  • ChatGPT
    • OpenAIによって開発された、人間の発話をシミュレートしてユーザーと自然なやり取りをするチャットボットのモデル
    • 人間によるフィードバックを用いた強化学習

参考:

ES2023について

JavaScript】ES2023の新機能

https://qiita.com/rana_kualu/items/84f66fe970f7feccf367

新機能

  • Array find from last
    • findLastの対応
  • Hashbang Grammar

リリース自動化に向けたブランチ戦略

リリース自動化の嬉しみとその手法

https://blog.kengo-toda.jp/entry/2022/02/17/193427

ブランチ戦略

  • リリースブランチを常時リリース可能状態にする

    • デフォルトブランチやリリースブランチが「常時リリース可能」であることを前提としている場合が多い
    • もしブランチが常時リリース可能でなかったら、リリース作業前に「リリース可能かどうか」を人間が検証する必要性が出てしまう
    • リリース可能性検証のプロセスを自動化して、マージ前ビルドないしリリースビルドで自動的に検証されるようにする
  • 「マージしたらリリースされてしまう」ことを「完成するまでマージするべきではない」と受け止めないことも必要

    • トピックブランチの寿命は短いほうが開発効率に良い影響がある。リリースできないとわかっている変更は公開することは避けつつ高頻度に変更をマージするためにFeature flugなどの工夫をする

ソースコードブランチを管理するためのパターン

https://martinfowler.com/articles/branching-patterns.html#ComparingFeatureBranchingAndContinuousIntegration

  • Base Patterns

    • Source Branching
    • Mainline
    • Healthy Branch -> 各コミットに対しテスト実行などで自動チェックし、ブランチに欠陥がないことを確認する
  • Integration Patterns

    • Mainline Integration
    • Feature Branching
    • Integration Frequency
      • Low-Frequency Integration
      • High-Frequency Integration
      • Comparing integration frequencies
    • Continuous Integration
    • Comparing Feature Branching and Continuous Integration -> 統合の頻度が高いほど、統合の関与が少なくなり、統合への恐怖が少なくなる
      • Feature Branching and Open Source
    • Pre-Integration Review
    • Integration Friction
    • The Importance of Modularity
    • Personal Thoughts on Integration Patterns
  • The path from mainline to production release

    • Release Branch
    • Maturity Branch
      • Variation: Long Lived Release Branch
    • Environment Branch
    • Hotfix Branch
    • Release Train
      • Variation: Loading future trains
      • Compared to regular releases off mainline
    • Release-Ready Mainline
  • Other Branching Patterns

    • Experimental Branch
    • Future Branch
    • Collaboration Branch
    • Team Integration Branch
  • Looking at some branching policies

    • Git-flow
    • GitHub Flow
    • Trunk-Based Development
    • Final Thoughts and Recommendations

個人的な整理

リリース可能状態が担保されたメインラインへ頻繁にマージしていくのが良い。 そのために、リリース見込みが経っていないものについては、

  • もし大きい機能で完成していない場合、フィーチャーフラグなどによって使えないようにするなど工夫する
  • デグレードなどが気になる場合、自動テストなどでカバーしていく
  • DBなどのデータの観点は変更容易性次第
  • セキュリティの観点はフレームワークと開発内容による
  • バージョニング管理とリリースノートはリリース方式次第

リリースするものについては、

  • (リリース物の切り戻しなど、アジャイルライクな考え方に繋がっていく。)

Effective Javaの要点ピックアップ

Effective Java 第3版 「ほぼ全章」を「読みやすい日本語」で説明してみました

https://qiita.com/nyandora/items/3e5ec76ca3881bc17924

本にも載っているよ、と説明したい際に。

オブジェクト生成まわり

  • コンストラクタよりstaticファクトリメソッドで
  • コンストラクタパラメータが多いときはビルダーで
  • シングルトンはenumかprivateのコンストラクタで
  • staticなメソッドとフィールドだけのクラスはprivateのコンストラクタでインスタンス化できないように
  • リソースは直接結びつけるよりも依存性注入で
  • オブジェクト生成は最低限に
  • 使われなくなったオブジェクト参照は取り除く
  • ファイナライザとクリーナーは使わない
  • try-finallyよりtry-with-resourcesを使う

オブジェクト共通メソッドまわり

  • equalsをオーバーライドするときは一般的な要件に従う
  • equalsをオーバーライドするときはhashCodeを常にオーバーライドする
  • toStringを常にオーバーライドする
  • cloneのオーバーライドは原則NG。もしする必要がある場合は注意する
  • Comparableの実装を検討する

クラスやインターフェースまわり

  • クラスとメンバーへのアクセス可能性は最小限に
  • publicのクラスではpublicのフィールドではなくアクセッサーメソッドで
  • 可変オブジェクトは最小限に
  • 継承よりもコンポジション
  • 継承する場合は継承される前提の設計および文書化する、でなければ継承を禁止する
  • 抽象クラスよりインタフェースで
  • 将来を見越したインタフェースを設計する
  • タグ付きクラスにせずクラス階層を分ける
  • 非staticのメンバークラスよりもstaticのメンバークラスを
  • ソースファイルを単一のトップレベルのクラスに限定する

ジェネリクスまわり

enumアノテーションまわり

  • int定数の代わりにenum
  • ordinalの代わりにインスタンスフィールドで
  • ビットフィールドの代わりにEnumSetで
  • ordinalをインデックスにする代わりにEnumMapで
  • enumをインタフェースで拡張可能に
  • 命名パターンよりアノテーション
  • 常にOverrideアノテーションを付けること
  • 型を定義するためにマーカーインターフェースで

ラムダやストリームまわり

  • 無名クラスよりラムダで
  • ラムダよりメソッド参照で
  • 標準の関数型インターフェースで
  • ストリームを注意して使う
  • ストリームは副作用のない関数で
  • 戻り値の型はStreamよりCollectionで
  • ストリームの並列化は注意する

メソッドまわり

  • パラメータの正当性を検査する
  • 必要な場合、防御的にコピーする
  • メソッドのシグニチャを注意深く設計する
  • オーバロードを注意して使う
  • 可変長引数を注意して使う
  • nullではなく、空コレクションか空配列を返す
  • Optionalを注意して返す
  • すべての公開API要素に対してドキュメントコメントを書く

全般

  • ローカル変数のスコープは最小限に
  • forループよりfor-eachループで
  • ライブラリを知り、ライブラリを使う
  • 正確な答えが必要である場合、floatとdoubleは避ける
  • ボクシングされた基本データより基本データ型で
  • 他の型が適切な場所では文字列型を避ける
  • 文字列結合のパフォーマンスに用心する
  • インターフェースでオブジェクトを参照する
  • リフレクションよりインターフェースで
  • ネイティブメソッドを注意して使う
  • 注意して最適化する
  • 一般的に受け入れられている命名規約を守る

例外まわり

  • 例外的な状態だけ例外を使う
  • 回復可能な状態にはチェック例外で、プログラミングエラーには実行時例外で
  • チェック例外を不必要に使うのは避ける
  • 標準的な例外を使う
  • 抽象概念に適した例外をスローする
  • 各メソッドがスローするすべての例外をドキュメント化する
  • 詳細メッセージにエラー記録情報を含める
  • エラーアトミック性に努める
  • 例外を無視しない

スレッドまわり

  • 共有された可変データへのアクセスを同期する
  • 過剰な同期は避ける
  • スレッドよりエグゼキュータ/タスク/ストリームで
  • waitやnotifyより並行処理ユーティリティで
  • スレッド安全性をドキュメント化する
  • 遅延初期化を注意して使う
  • スレッドスケジューラに依存しない

シリアライズまわり