AWS初心者向け~ゼロからECSアプリケーションの構築まで~ ECS 前編
5. ECS編
目次
- ECSとは。まずコンテナ開発について
- ECRでのリポジトリ作成とDocker Imageのpush
- Cloudformationを利用したECSクラスター、サービス、タスク定義の作成
- ECSクラスター、サービス、タスクについての説明
- HTTPS接続のためのopenssl証明書の作成とアップロード
- Application Load Balancerの作成とセキュリティグループ、ターゲットグループの作成
本講座で利用するDockerfileと関連するファイル、Cloudformationテンプレートファイルは、
こちらのGithubリポジトリに配置してます。
1. Dockerとは?、またその利点
まずコンテナ技術に関して
比較されるものとしてVagrantがサーバー側(ホスト)仮想化です。
比較図は、こちら
メリット
- アプリケーションの依存関係をコンテナ内で完結できる。...例えばローカルPCにインストールしたNode.jsのバージョンが違うからアプリの挙動が若干違うなどなどの問題を解決できます。Dockerfileで細かく記述された環境を誰でも再現できるためです。
- ローカルから別環境(開発環境、ステージング環境、本番環境)での構築・テストが効率化されます。(環境が同じなので)
以下がDockerのコンテナワークフローです。
Docker Desktopまたは Rancher Desktopのインストール
Docker DesktopまたはRancher Desktopをインストールして、DockerデーモンをローカルPC
に動かせるようにしましょう。
ついでにDocker Desktopは今までは商用利用が無料でしたが、現在では商用利用は有料です。
そのため商用利用でも無料なRancher Desktopを代替品として使ってます。
AWS CLIを使用可能な状態にする。
ここではIAMユーザーのアクセスキーを作成して、AWS CLIのプロファイルとして構成します。
- AWS IAMのユーザーでアクセスキーを作成する。
- 作成したアクセスキーとシークレットキーは厳密に保管する。
- aws configureでprofile名を設定してaws cliがAWSリソースにアクセス可能な状態にする。ここでCSVファイルでダウンロードした、Access Key IdとSecret Keyを画面の指示に従い入力する。
aws configure --profile profile-name
- これでセットアップ完了。以下コマンドで作成されたprofile情報が反映されているか確認する。
aws configure list --profile profile-name
2. ECRでのリポジトリ作成とDocker Imageのpush
1. ECRにリポジトリを作成する。
-
まずECRにてプライベートリポジトリを作成します。
-
ローカルでECSアプリ本体となるDockerfileのあるパスをカレントディレクトリとする。
-
Docker デーモンが起動している状態で以下コマンドを実行する。
docker build . -t <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-app:latest
-
dockerイメージができたら追加でタグを設定する。(ここでは、1.0と設定)
docker tag ecs-app:latest <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-app:latest
<your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-app:1.0
- ECRへのログイン情報を取得し、Dockerにログインする
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
- ECRにdockerイメージをpushする。
docker push <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-learning:latest docker push <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-learning:1.0
3. Cloudformationを利用したECSクラスター、サービス、タスク定義の作成
-
ECSタスク実行用IAMロール「ECS-Learning-TaskExecutionRole」を作成する。ポリシーには「AmazonECSTaskExecutionRolePolicy」、「CloudwatchLogsFullAccess」をアタッチする。
-
クラスター、タスク定義、サービスを記載したCloudformationテンプレートを用意する。
AWSTemplateFormatVersion: 2010-09-09
Resources:
ECSCluster:
Type: 'AWS::ECS::Cluster'
Properties:
ClusterName: MyEcsCluster
ECSTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: my-ecs-task
NetworkMode: awsvpc
ContainerDefinitions:
- Name: my-ecs-learning-container
Image: <your-account-id>.dkr.ecr.us-east-1.amazonaws.com/<your-repo-name>/<your-image-name>:latest
Essential: true
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: /ecs/fargate-task-definition
awslogs-region: us-east-1
awslogs-stream-prefix: ecs
mode: non-blocking
awslogs-create-group: "true"
max-buffer-size: 25m
PortMappings:
- ContainerPort: 80
HostPort: 80
Protocol: tcp
- ContainerPort: 443
HostPort: 443
Protocol: tcp
Memory: 512
Cpu: 256
ExecutionRoleArn: <your-ecs-task-execution-role-arn>
TaskRoleArn: '<your-ecs-task-execution-role-arn>'
RequiresCompatibilities:
- FARGATE
RuntimePlatform:
CpuArchitecture: X86_64
OperatingSystemFamily: LINUX
ECSService:
Type: 'AWS::ECS::Service'
Properties:
ServiceName: ecs-learning-service
Cluster: !Ref ECSCluster
DesiredCount: 1
LaunchType: FARGATE
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: ENABLED
SecurityGroups:
- your-ecs-security-group-id
Subnets:
- your-private-subnet-id
- your-private-subnet-id
TaskDefinition: !Ref ECSTaskDefinition
your-xxxx系の箇所は、適時ご自身の今までのECSアプリケーション作成講座手順で作成した
AWSリソースのid値、ARNに置き換えてください。
- 作成したcfテンプレートをアップロードする。
- スタックの名前を記載する。
- 諸々のオプションは今回は設定せずスキップ。(Cloudformationの講座ではないので詳細は割愛)
- 確認画面で諸々の設定値を確認し、送信をクリックする。
- あとはECSクラスター、ECSサービス、ECSタスクが作成するので完了まで見守ります。
ここまで実施することで、ECSタスクが正常に動作していることがECSタスクの状況とCloudwatchログから確認できると思いますが、肝心のECSタスクで稼働しているhttpdのウェブサーバーにアクセスできません。
ECSタスクをプライベートサブネットに作成しており、NATゲートウェイがアウトバウンドの通信をうまく調節してIGWに飛ばしてくれますが、インターネットからくるインバウンドの通信に対応しているわけではないためです。
インターネットからアクセス可能にするために後編ではアプリケーションロードバランサーを用意します。
Discussion