LoginSignup
0
0

More than 1 year has passed since last update.

Amazon ECS & Fargate と Docker on AWS CICDの学習まとめ(超初心者向け)

Last updated at Posted at 2022-03-31

これからはAWSのFargateだ!

ということで学習しながら設定の流れをメモとして随時更新します。

学習内容 ECS & Fargate, Load Balancing, Auto Scaling, ECR, CICD for ECS
最終的には、Rubu on Rails をFargateで動かすところまで目指します。

AWSの準備&ユーザ設定

  • AWSのアカウント作成
  • IAM ユーザーの設定
    ルートユーザ→Adominユーザ
    • AWS アクセスの種類を選択(全部選択)
    • アクセス許可の設定
      →既存のポリシーを直接アタッチを選択
      →AmazonECS_FullAccessを選択
    • タグの追加 (不要)
    • 認証情報(コンソールのサインインリンク保存)
    • アクセス権限の追加
      →既存のポリシーを直接アタッチを選択
      →AdministratorAccess

Fargateの設定

  • リージョンを選択(東京)
  • Elastic Container Service (ECS)を選択
  • 2022/04時点では、ECS エクスペリエンスは古い方で設定を開始する
  • ECS オブジェクトとそれらの関連を示す図
    スクリーンショット 2022-04-01 6.02.35.png
  • タスク定義名 nginx-tdに変更
  • クラスター名 nginx-clusterに変更
  • お金をチャージされるで一旦削除
    →左サイドバー:クラスターを選択
    →サービスのタブを選択
    →サービス名をチェックして「削除」を選択
    →タスクのタブを選択
    →すべてを停止

構成図作成ツール:Diagram(無料)

複数サービスの場合の構成イメージ

ECSクラスター_複数サービス.drawio.png

テスト用と本番用のアーキテクチャのイメージ

Docker-ECSアーキテクチャー2.drawio.png

ECSの料金について

  • テストは、無料枠ではできないので2,000円〜3,000円前後かかる想定。
  • コストを抑えるため学習していない時は以下の対応をする。
    • EC2インスタンスの終了させる。
    • ECSサービスを0にする。

ECSとEKSとBeanstalkの違い

Docker構成図・インストール

Docker コマンド基礎

正しい内容は、ドキュメンを確認してください。

使ったものを以下にまとめます。

内容 コマンド 備考 
コマンドでインストールできたか確認する $ docker run hello-world
イメージ一覧 $ docker image ls $ docker images(旧)
コンテナ一覧 $ docker container ls $ docker ps(旧) -aで全て表示
コンテナを全部表示一覧 $ docker container ls --all
Docker Hubのイメージを検索(例 nginx) $ docker search nginx
名前をつけてコンテナを立ち上げる
例)nginxのimageから名前をつけてコンテナを立ち上げる
$ docker run --name (CONTAINER NAMES) -P -d nginx * run:新しいコンテナを実行する命令
* --name:名前をつける
* -P:コンテナのポートをホスト側に公開
* -d:コンテナをバックグラウンドで実行し、コンテナ ID を表示 
詳細情報表示 $ docker inspect (IMAGE ID)
コンテナを起動する $ docker start (IMAGE ID)
コンテナを停止する $ docker stop (IMAGE ID)
使われていないイメージなどを削除 $ docker system prune
Dockerfileをビルド $ docker build -t (New Docker Name) . -t:タグ名を指定 
imageを動かす $ docker run (New Docker Name)
imageを削除する $ docker image rm (Image ID)
コンテナを削除する $ docker rm (Container ID)

ECS クラスター図解

ECSクラスター.drawio.png

ECS クラスターとIAM設定図解

ECSクラスター_IAM.drawio.png

ロール(Roles)の追加

  • EC2 Role for Elastic Container Serviceのロール追加
    IAM>ロール>ロールを作成>ユースケース>EC2 Role for Elastic Container Service(検索)
  • Elastic Container Serviceのロール追加
    ユースケース>Elastic Container Service(検索)
  • Elastic Container Service Taskのロール追加
    ユースケース>Elastic Container Service Task(検索)
    • 許可を追加
      TaskExecutionにチェック
  • Elastic Container Service Autoscaleのロール追加
    ユースケース>Elastic Container Service Autoscale(検索)

コアのインフラストラクチャー

Docker-ECS設定2.drawio.png

$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
$ aws help
# heplでコマンド一覧

$ aws configure --profile adminuser
# プロンプトが表示されたら、Application Auto Scaling で使用する IAM ユーザーの AWS アクセスキーとシークレットアクセスキーを指定します。

#aws_access_key_id = adminuser access key ID
#aws_secret_access_key = adminuser secret access key
#region = aws-region
#default output format = json

# /Users/ichigobranding/.aws/credentials に記載されている
  • プロファイルが正しく設定されている場合は、以下のような出力が表示されます。
$ aws configure --profile adminuser

AWS Access Key ID [****************52FQ]: 
AWS Secret Access Key [****************xgyZ]: 
Default region name [us-east-1]: 
Default output format [json]: 
  • IAMユーザーの確認
$ aws iam list-users
  • プロファイルの確認
$ aws configure list
  • プロファイルを自分のアカウントに切り替える(デフォルトの設定:例 user1)
$ export AWS_DEFAULT_PROFILE=user1

Macのzshでコマンド補完の設定をした場合

$ cd /usr/local/bin/
$ touch .zshrc
$ vim ~/.zshrc 

下記を.zshrc の1行目に記載
autoload -Uz compinit && compinit
autoload -U bashcompinit && bashcompinit
complete -C '/usr/local/bin/aws_completer' aws
EOF

$ source .zshrc

$ aws s → 補完が出たら完了
  • コマンドでインフラストラクチャーを一括で生成
$ aws cloudformation create-stack --capabilities CAPABILITY_IAM --stack-name ecs-core-infrastructure --template-body file://./core-infrastructure-setup.yml
  • CloudFormationで確認する
    CloudFormation>スタック (リージョンをあわせる)
    • ecs-core-infrastructure
      VPC and subnets as base for an ECS cluster
    • EC2ContainerService-nginx-cluster
      AWS CloudFormation template to create a new ECS Fargate First Run stack
  • VPNで確認する

ECSを作成する(EC2ベース)

Amazon Elastic CEontainer Service>クラスター>作成

  • クラスター名前を設定

  • VPCは、作ったものを選択

  • サブネット2つ選択

  • Amazon EC2 インスタンスにチェックを入れる
    Auto Scaling グループ (ASG)の作成
    Docker-ECS設定_EC_ASG.drawio.png

    • オペレーティングシステム/アーキテクチャ
      →Aamazon Linux3(arm64)を選択
    • EC2 インスタンスタイプ
      →a1.mediumを選択
    • 必要な容量
      →1

ECSをFargateベースに変更する

Docker-ECS設定_fargate_ASG.drawio.png

ECSをCloudFormationにする

Docker-ECS設定_CloudFormation.drawio.png

Launchtype Fargate:

aws cloudformation create-stack --stack-name ecs-fargate --capabilities CAPABILITY_IAM --template-body file://./ecs-fargate-via-cloudformation.yml

Launchtype EC2:

aws cloudformation create-stack --stack-name ecs-ec2 --capabilities CAPABILITY_IAM --template-body file://./ecs-ec2-via-cloudformation.yml

ECS CLIでoutputのkeyを表示させる

export CORE_STACK_NAME="ecs-core-infrastructure"
export vpc=$(aws cloudformation describe-stacks --stack-name $CORE_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`VpcId`].OutputValue' --output text)
export subnet_1=$(aws cloudformation describe-stacks --stack-name $CORE_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`PublicSubnetOne`].OutputValue' --output text)
export subnet_2=$(aws cloudformation describe-stacks --stack-name $CORE_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`PublicSubnetTwo`].OutputValue' --output text)

echo "vpc: $vpc"
echo "subnet1: $subnet_1"
echo "subnet2: $subnet_2"

Amazon ECS CLI セットアップ

#①ダウンロード
$ sudo curl -o /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest

#②パーミッション変更
$ sudo chmod +x /usr/local/bin/ecs-cli

#③バージョンの確認
$ ecs-cli --version
  • ecs-cli configure の設定
# リージョン・クラスタ名の設定
$ ecs-cli configure --region region名 --cluster cluste名 --default-launch-type FARGATE -config-name config名

ECS:launch-type FARGATEを作成する

ecs-cli up \
--subnets $subnet_1,$subnet_2 \
--vpc $vpc \
--launch-type FARGATE \
--cluster ecs-fargate

ECS:launch-type EC2を作成する

ecs-cli up --capability-iam \
--subnets $subnet_1,$subnet_2 \
--vpc $vpc \
--launch-type EC2 \
--keypair ecs-course \
--size 1 \
--instance-type t2.small \
--cluster ecs-ec2

ECS サービス ALB

Docker-EC2_Service.drawio.png

ecs-cliでvpc名・subnet名をエクスポートする

export CORE_STACK_NAME="ecs-core-infrastructure"
export vpc=$(aws cloudformation describe-stacks --stack-name $CORE_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`VpcId`].OutputValue' --output text)
export subnet_1=$(aws cloudformation describe-stacks --stack-name $CORE_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`PublicSubnetOne`].OutputValue' --output text)
export subnet_2=$(aws cloudformation describe-stacks --stack-name $CORE_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`PublicSubnetTwo`].OutputValue' --output text)

上記は、設定のみで何も表示されないので、echoで表示させる

echo "vpc: $vpc"
echo "subnet1: $subnet_1"
echo "subnet2: $subnet_2"

ecs-cliでCloudFormationにecs-ec2を設定する

ecs-cli up --capability-iam \
--subnets $subnet_1,$subnet_2 \
--vpc $vpc \
--launch-type EC2 \
--keypair ecs-course \
--size 1 \
--instance-type t2.small \
--cluster ecs-ec2

EC2でセキュリティグループを作成

EC2>セキュリティグループ>セキュリティグループを作成

Fargateを使ったタスクとサービスの設定

Docker-テスク・サービスの設定.drawio.png

  • ECSのタスクをデプロイ
    Amazon Elastic Container Service>クラスター>ecs名>タスク
  • ECSのサービスをデプロイ
    Amazon Elastic Container Service>クラスター>ecs名>サービス

EC2を使ったタスクとサービスの設定

Docker-Copy of テスク・サービスの設定.drawio.png

  • ECSのタスクをデプロイ
    Amazon Elastic Container Service>タスク定義
    Amazon Elastic Container Service>タスク定義>作成
    • 新しいリビジョンの作成
      Amazon Elastic Container Service>タスク定義>td-ec2-wisdom-final>リビジョン 2>リビジョンを作成
    • インバウンドのルールを編集
    • 新しい管理画面では、「パブリック IP」が表示されていないため、古い画面に切り替え、インバウンドルールを変更(変更しないとブラウザで見れない)
      クラスター>ecs-ec2>タスク: ID
      → EC2 インスタンスのIDをクリック
      【説明タブより】セキュリティグループ>ID>インバウンドのルールを編集
      HTTP→すべてのICP
  • ECSのサービスをデプロイ>Amazon Elastic Container Service>クラスター>ecs-ec2>サービスの作成

Amazon ECS タスク配置戦略

Docker-ECSTaskPlacement.drawio.png

"placementStrategy": [
    {
        "field": "memory",
        "type": "binpack"
    }
]
"placementStrategy": [
    {
        "type": "distinctInstance"
    }
]

"placementStrategy": [
    {
        "expression": "attribute:ecs.instance-type =~ t2.*",
        "type": "memberOf"
    }
]

ECS Networking Mode

Docker-ECS NetworkingMode.drawio.png

ECSのセキュアーなアーキテクチャの設定

Docker-Extended ECS Architecture Setup.drawio.png
※ALB・NatGWに費用がかかる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0