AWS SOAチートシート

## はじめに
今回は、SOA受験に役立つチートシートです。

このチートシートは、
* 全体概要の把握
* 勉強中に関連知識を確認する
* 試験直前の詰め込み

など、学習初期から試験直前まで幅広く活用できます。必要に応じて自分なりのチートシートにまとめ直してもいいと思います。適宜活用して知識を深めるのに役立てばうれしいです。



## Aurora
### データ復旧
* バックトラック機能
→ 上限72時間まで新しいDBクラスタを作成することなく過去のDBクラスタにバックトラックできる
* ポイントタイムリカバリ機能
→ 新しいDBクラスタにデータ復元
* スナップショット活用
→ スナップショットは保存期間上限なし。新規クラスタを作成してコピーできる

## CloudFormation
### 典型的なテンプレート

以下はCloudFormationのテンプレ要素を可能な限り詰め込んだもの。各部位の解説はコメントに表記
```yaml:yaml
AWSTemplateFormatVersion: '2010-09-09'

#テンプレの目的を表記
Description: "EC2インスタンス、VPC、S3バケットを含むインフラストラクチャのテンプレート"

#外部からの入力を受け取るためのセクション。
Parameters:
  InstanceType:
    Description: "EC2インスタンスのタイプ"
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium
    ConstraintDescription: "有効なEC2インスタンスタイプを選択してください。"

  KeyPairName:
    Description: "EC2インスタンスにSSH接続するためのキーの名前"
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: "有効なEC2キーペアを指定してください。"

#リージョンに応じた値を設定できるセクション。AMIはリージョンごとに変える必要がある事に注意
Mappings:
  RegionMap:
    us-east-1:
      AMI: "ami-0c55b159cbfafe1f0"
    us-west-1:
      AMI: "ami-0bdb828fd58c52235"
    eu-west-1:
      AMI: "ami-047bb4163c506cd98"

#特定の条件に基づいてリソースを作成するかどうかを制御。この例では、EnvTypeがprodの場合にのみリソースを作成するという条件を定義
Conditions:
  CreateProdResources:
    Fn::Equals:
      - !Ref EnvType
      - prod

#AWSリソースを定義
Resources:
  MyVPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: "10.0.0.0/16"
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: "MyVPC"

  MyPublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: "10.0.1.0/24"
      MapPublicIpOnLaunch: true
      AvailabilityZone: !Select [ 0, !GetAZs "" ]
      Tags:
        - Key: Name
          Value: "MyPublicSubnet"

  MySecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Enable SSH and HTTP access"
      VpcId: !Ref MyVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyPairName
      SecurityGroupIds:
        - !Ref MySecurityGroup
      SubnetId: !Ref MyPublicSubnet
      ImageId: !FindInMap [ RegionMap, !Ref "AWS::Region", AMI ]
      Tags:
        - Key: Name
          Value: "MyEC2Instance"

  MyS3Bucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Sub "my-s3-bucket-${AWS::Region}-${AWS::AccountId}"
      AccessControl: Private
    DeletingPolicy: "Retain" #削除ポリシーはDelete(削除)、Retain(保持)、Snapshotが選べる

#スタック作成後に出力する情報を指定
Outputs:
  VPCId:
    Description: "作成されたVPCのID"
    Value: !Ref MyVPC
  InstancePublicIP:
    Description: "EC2インスタンスのパブリックIPアドレス"
    Value: !GetAtt MyEC2Instance.PublicIp
  S3BucketName:
    Description: "作成されたS3バケットの名前"
    Value: !Ref MyS3Bucket
```
## CloudFront

### OAC(オリジンアクセスコントロール)
CroudFrontにOACというユーザを設定できる。S#のバケットポリシーでOACからのアクセスに限定することでCloudFrontからのアクセスに限定できる。

https://aws.amazon.com/jp/blogs/news/amazon-cloudfront-introduces-origin-access-control-oac/

### キャッシュヒット率の向上方法
1.TTL(Time To Live)値を延長してキャッシュを増やす
2.Origin Shieldを有効化することでオリジンへのリクエストを集約する

## Cloud Trail
### CloudTrail Insights
APIコールの異常なパターンを検出するなどセキュリティ分析に便利なツール。

### CloudTrail Processing Library
ログ処理を支援するJavaライブラリ

## CloudWatch

### CloudWatchエージェント
EC2などにインストールすることでエージェントからCloudWatchにメトリクスを送信できる。メモリ使用率やディスク使用率などの監視はユーザの責任範囲内なのでカスタムメトリクスを使用するためエージェントが必要。

## EC2

### EC2ユーザーデータ
インスタンスの初回起動時にシェルスクリプト形式またはcloud-init形式でデータを提供しパッケージやソフトウェアのインストール/アップデートを実行させられる

### 大規模なインスタンス群にパッチを適用する
Lambdaで作成した関数をSystems ManagerのRun Commandで実行する。TargetsパラメータにOSのタグを指定することで適切なインスタントにコマンドを実行できる。


## ELB(Elastic Load Balancer)
Network Load Balancerは作成時にElastic IPアドレスをアタッチ可能。API GatewayはGlobal Acceleratorと、Application Load BalancerはNetwork Load Balancerと組み合わせることで可能。

リージョンを跨いだ負荷分散には使用できない

## Global Accelerator
IPアドレスを固定してアプリケーションへのトラフィックルーティングを最適化するサービス。ファイルのアップロードなど(S3)を速くするサービスではない→アップロードの高速化にはS3TransferAccelerationやマルチパートアップロードを用いる。

## Organizations
グローバル条件キーのPrincipalOrgIDは、組織内のすべてのAWSアカウントのアカウントIDリストのように扱える。これにより効率よく指定する組織に属するアカウントのみアクセスできるようになる

## RDS

### RDS Proxyの活用事例
* lambdaからRDSに対してmax_connection値を超えるリクエストが来てtoo many connectionsエラー
→　RDS Proxyでコネクションプールを作成することでDB効率向上

### 暗号化について
暗号化オプションの有効化はRDSインスタンス作成時のみ可能
→ 既存のRDSを暗号化する際はスナップショットをコピーし、暗号化したものを新しいインスタンスとして復元する


## S3
### 静的Webサイトのホスティング
以下の設定をする
* パブリックアクセスをオフ
* バケットポリシーでGETアクションを許可
* 静的Webサイトホスティングを有効化
* インデックスドキュメントの設定とアップロード

### インターネットにアクセスすることなくS3に接続する
S3ゲートウェイエンドポイントを作成し、プライベートサブネットはアタッチする
※インターフェースエンドポイントは追加のコストがかかるので基本は無料のゲートウェイエンドポイント
※EC2インスタンスのようにインスタンス直接はアタッチできない。あくまでサブネット

## VPC

### ネットワークACL
サブネットに割り当てることで特定のIPアドレスのトラフィックをコントロールできる

### セキュリティグループ
インスタンスに割り当てる。インスタンスへのアクセスを許可したり、トラフィックを制御できる
* インバウンド → デフォルトでは全て拒否。許可した通信のみ通過
* アウトバウンド → デフォルトで全て許可

### VPC外部向きのインターネット通信のみ許可
Egress-OnlyInternet Gatewayを作成し、0.0.0.0/0(IPv6なら::/0)トラフィックをルーティング


## WAF

### WAFで保護できるリソースタイプ
* Amazon CloudFront ディストリビューション
* Amazon API Gateway REST API
* Application Load Balancer
* AWS AppSync GraphQL API
* Amazon Cognito ユーザープール
* AWS App Runner サービス
* AWS 検証済みアクセスインスタンス

## ポート番号
80:HTTP
443:HTTPS