あきろぐ

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

ecs-cliを使ってみる

概要

awsコマンドラインツールはaws-cliがありますが、ecsに特化したecs-cliを使えば、ローカルからクラスタやタスクの作成や簡単なモニタリングをすることが可能です。 そのecs-cliの導入とちょっと使ってみたときのメモです。

導入

macOSの場合

ecs-cliのバイナリをダウンロードする

~ $ sudo curl -o /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest

ecs-cliの検証をする

オプションの手順ではありまずが、ダウンロードしたバイナリファイルの有効性を検証するために、MD5サムを使います。 コマンド実行後、同じ文字列が出力されていることを確認します。

~ $ sudo curl -o /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest

xxxxxxxxxxx
xxxxxxxxxxx

実行権限を付与する

ダウンロードしたバイナリファイルに実行権限を付与してコマンドとして使えるようにします。

~ $ sudo chmod +x /usr/local/bin/ecs-cli

# 下記コマンドが実行できればOK
~ $ ecs-cli --version
ecs-cli version 1.18.1 (7e9df84)

使ってみる

困ったらhelp コンテナインスタンスをスケールさせることができたり、Dockerイメージをプルしたりプッシュすることもできます。

~ $ ecs-cli --help
NAME:
   ecs-cli - Command line interface for Amazon ECS

USAGE:
   ecs-cli [global options] command [command options] [arguments...]

VERSION:
   1.18.1 (7e9df84)

AUTHOR:
   Amazon Web Services

COMMANDS:
     configure         Stores a single cluster configuration.
     up                Creates the ECS cluster (if it does not already exist) and the AWS resources required to set up the cluster.
     down              Deletes the CloudFormation stack that was created by ecs-cli up and the associated resources.
     scale             Modifies the number of container instances in your cluster. This command changes the desired and maximum instance count in the Auto Scaling group created by the ecs-cli up command. You can use this command to scale up (increase the number of instances) or scale down (decrease the number of instances) your cluster.
     ps                Lists all of the running containers in your ECS cluster.
     push              Pushes an image to an Amazon ECR repository.
     pull              Pulls an image from an Amazon ECR repository.
     images            Lists images from an Amazon ECR repository. Lists all images in all repositories by default.
     license           Prints the LICENSE files for the ECS CLI and its dependencies.
     compose           Executes docker-compose-style commands on an ECS cluster.
     check-attributes  Checks if a given list of container instances can run a given task definition by checking their attributes. Outputs attributes that are required by the task definition but not present on the container instances.
     logs              Retrieves container logs from CloudWatch logs. Assumes your Task Definition uses the awslogs driver and has a log stream prefix specified.
     registry-creds    Facilitates the creation and use of private registry credentials within ECS.
     local             Runs your ECS tasks locally.
     help, h           Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --endpoint value  Use a custom endpoint with the ECS CLI
   --help, -h        show help
   --version, -v     print the version

ecs-cli psコマンド ECS クラスターで実行中のすべてのコンテナを一覧表示する

~ $ aws-vault exec my-profile -- ecs-cli ps --cluster test-develop
Name                                                  State    Ports                           TaskDefinition                       Health
xxxxx-xxxx-xxxx-xxxx-xxxxx0c773e/test  RUNNING                                  test-test:3               HEALTHY

参考文献

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI_installation.html

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": "*"
        }
    ]
}