あきろぐ

いろいろめもするよ🐈🐈🐈

Route53を使う

AWS勉強ログ。

Route53

ドメインを取得するとき

取得したいドメインを入力し、「チェック」する f:id:akngo22:20200308222650p:plain

入力したドメインが使えるかどうか確認できる。取得できない場合、代替で使えるものが下部に表示される。 f:id:akngo22:20200308222731p:plain 選択したら、個人情報を入力し購入すればOK

ホストゾーン作成するとき

ドメイン名を入力し、タイプを「パブリック」か「プライベート」か選択して「作成」する f:id:akngo22:20200308223608p:plain 作ったゾーンの中身をみるとNSレコードとSOAレコードが作成されていることが確認できる

レコードを作成するとき

ホストゾーンの中でレコード作成をクリックする Aレコードを選択した時、対象のIPアドレスTTL、ルーティングポリシーを指定する f:id:akngo22:20200308224136p:plain

エイリアスを「はい」にした場合、エイリアス先のターゲットを指定できる。例えば、Cloudfrontのディストリビューションドメイン名、ロードバランサーDNS名など。 f:id:akngo22:20200308224417p:plain

ルーティングポリシーについて

Route53のルーティングポリシーは、以下6つある。シンプル以外のルーティングポリシーを使うときは識別子を各レコードに設定する必要がある。

  • シンプル
    • デフォルトのルーティングポリシー
  • フェイルオーバー
    • アクティブ・スタンバイ方式を取り、アクティブのヘルスチェックに失敗したらスタンバイ側にルーティングする
    • プライマリとセカンダリレコードを設定する f:id:akngo22:20200322231311p:plain
  • 位置情報
    • ユーザーの位置情報をもとにトラフィックをルーティングする
    • 陸別、国別、米国の州別から選択できる
    • ヨーロッパからのリクエストは全てあるロードバランサに送りたいときなどに使う f:id:akngo22:20200322231917p:plain
  • レイテンシー
    • 複数箇所(リージョン)にサーバーが配置されているときネットワークレイテンシが一番小さいところにルーティングする
    • レコードごとにリージョンを指定する f:id:akngo22:20200322231146p:plain
  • 複数値回答
  • 加重
    • 指定した比率で複数リソースにトラフィックをルーティングするときに使う
    • 全レコードの重みから1レコードにどれくらいの重みを割り当てるか
      • 例えば20:80など
    • サーバー切り替えのときなど徐々に比率を増やしていくやり方もある f:id:akngo22:20200322230654p:plain

CloudFrontを使う

AWS勉強ログ。今回は、CloudFrontです。

CloudFrontとは

  • HTMLファイルやCSS、画像や動画などの静的コンテンツをキャッシュして、オリジンサーバーの代わりに配信するCDN(Contents Delivery Network)サービス
  • AWSは世界中にエッジロケーションが120あり、利用者から一番近いエッジロケーションからコンテンツを高速で配信することが可能
  • CloudFrontがコンテンツをキャッシュすることで、オリジンサーバーの負荷を軽減させることができる

バックエンド

  • バックエンド(オリジンサーバー)としてELB、EC2、S3の静的ホスティングを利用することが可能
  • オンプレミスのサーバーも指定することができる
  • 複数のオリジンサーバーを1つのCloudFrontに指定することができ、拡張子別やURLパスによって振り分けられる

ディストリビューション

キャッシュ

  • 拡張子やURLパスごとにキャッシュ期間を指定できる
  • 頻繁にアップデートされるコンテンツはキャッシュを短く、そうでないものはキャッシュを長くし運用のことを考えて指定
  • 動的なサイトはキャッシュを無効化することでCloudFrontをネットワーク経路として使用することもできる

実際に使ってみる

最初にディストリビューションを選択する。今回はWebを選ぶ。 f:id:akngo22:20200308161004p:plain

  • オリジンサーバーを指定する

    • 「Origin Domain Name」のお枠内を選択するとオリジンサーバー一覧をみることが可能
    • オリジンサーバーを選択すると「Origin ID」が自動的に入力される
    • 「Origin path」は「Origin Domain Name」以降でパスを指定したい場合に使う。
    • 例えば「xxx.example.com/production」のように指定するならば「/production」をOrigin pathに入力する。
    • 「Restrict Bucket Access」は、特定のS3バケットへのアクセスを特定のCloudfrontからのみにしたい場合に有効にする。
    • 「Origin Custom Header」は、デフォルトのリクエストヘッダーにKeyとValueを追加することで、オリジンサーバーにカスタムしたヘッダーを送ることができる f:id:akngo22:20200308162225p:plain
  • キャッシュの設定をする

    • 「Viewer Protocol Policy」はビューアーがコンテンツにアクセスするときに許可するプロトコルを指定できる
    • 「Allowed HTTP Methods」は許可するHTTPメソッドを選択
    • 「Field-level Encryption Config」はフィールドレベルで暗号化するかどうか(Allowed HTTP MethodsGET, HEAD, OPTIONS, PUT, POST, PATCH, DELETEを選択したときに設定できる)
    • 「Cache Based on Selected Request Headers」でリクエストヘッダをキャッシュするか設定できる。「Whitelist」を選択するとキャッシュするヘッダーを選択することができる
    • 「Object Caching」をカスタムにするとTTLをカスタマイズすることができる
    • 「Lambda Function Associations」ではCloudfrontにLambda@Edgeを紐づけることが可能(例えばBasic認証用のLambdaなど) f:id:akngo22:20200308164645p:plain
  • ディストリビューション詳細設定

    • AWS WAF Web ACL」はCloudFrontに紐づけるWAFのWebACLを選択できる
    • 「Alternate Domain Names(CNAMEs)」はオリジンサーバーのCNAMEを指定できる
    • SSL Certificate」はオリジンサーバーのCNAMEでコンテンツを配信する場合はSSL証明書を発行する必要がある。AWSだとACMSSL証明書発行できる。
    • 「Logging」ロギングを有効にするとS3にログを蓄積させることができる
    • Bucket for Logs」ログ格納用のバケットを指定 f:id:akngo22:20200308173816p:plain
  • パスによる振り分けをする場合

「Behaviors」タブから設定できる。パスパターンごとにオリジンを指定する。 f:id:akngo22:20200308180742p:plain

ECSのタスクロールとタスク実行ロール

ECSのタスクロールとタスク実行ロールは何が違うのかのメモ

タスクロール

AWSの開発者ガイドには以下のように書かれている。

Amazon ECS タスク用の IAM ロールを使用すると、タスクのコンテナで使用できる IAM ロールを指定できます。

上記の文言からだと分かりにくいが、「タスクのコンテナ=タスクを実行しているEC2インスタンス」のためのIAMロールであると解釈できる。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html

タスク実行ロール

これは、読んで字のごとくタスクを実行するために必要なルールである。 デフォルトでは、AWSが管理している「AmazonECSTaskExecutionRolePolicy」があり、このポリシーの中にはECRからDockerイメージをプルしたり、コンテナログをCloudwatchに格納するために必要な権限が含まれている。 ロールの中身は以下の通り

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    }
  ]
}

また、タスク定義の環境変数の設定でパラメータストアやシークレットマネージャからセキュアな情報等をパラメータストアから取得する場合は、追加で必要な権限がある。

  • ssm:GetParameters:パラメータストアから値を取得する
  • secretsmanager:GetSecretValue: セキュアな情報を取得する(パラメータストア またはシークレットマネージャ)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters",
                "secretsmanager:GetSecretValue",
                "kms:Decrypt"
            ],
            "Resource": "*"
        }
    ]
}

ECSタスクのCPUとメモリをチューニングする

ECSのtask定義のメモリとCPUをチューニングするときのメモ

メモリ制限

メモリは「ハード制限」と「ソフト制限」があり、2つの値を設定するとき必ず「ハード制限>ソフト制限」である必要がある。

  • 「ソフト制限」は、コンテナに予約するメモリ量(MiB)
  • 「ハード制限」は、メモリ使用量がこの値を超えると強制的にコンテナが終了するメモリ量(MiB)
    • ハード制限を設定することで一時的にメモリ使用量がバーストしても使うことができる

適正値がわからない場合、以下の範囲から始めると良いと言われている。

ECS ではウェブアプリケーション用に 300〜500 MB から始めることをお勧めします。

CPUユニット

  • ECSコンテナエージェントがコンテナ用に予約したCPUユニット数
  • コンテナインスタンス(EC2)にはCPUコアごとに1024ユニットある
  • 下記リンクにあるインスタンスタイプのvCPU数に1024かけることで使用可能なCPUユニット数を算出することができる

aws.amazon.com

チューニング方法

ECSのメモリとCPUのメトリクスは、サービスごとに監視しているので、Amazon開発ガイドに記載されている「サービス使用率」を使ってメモリとCPUをチューニングしていく。
それぞれ、現在のサービス使用率、タスクに割り当てているメモリ、CPU、サービスのタスク数が分かっているので、現在の使用率を算出することが可能である。

f:id:akngo22:20200303225306p:plain
サービスCPU使用率

f:id:akngo22:20200303225431p:plain
サービスメモリ使用率

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cloudwatch-metrics.html#cluster_utilization

# CPU使用率が90%で割り当てCPUユニットが500、タスク数が2出会った場合
90=(100x/500*2)
x=900
つまり、1つのタスクあたり450CPUユニット使用していることがわかる

# メモリ使用率
メモリ使用率も算出の仕方はCPUと同様
ソフト制限を指定した場合、メモリ使用率を求めるためにその制限値が計算に使われ、ハード制限を指定した場合はハード制限に設定したメモリ量が使われる

使用率をどの程度に抑えたいかで割り当てるCPUユニットやメモリ量を変更することができる。