Perl Hackers Hub

第61回 GitHub ActionsとAmazon ECSを使ったDockerアプリケーションの自動デプロイ(1)

この記事を読むのに必要な時間:およそ 3 分

Amazon ECSへデプロイしよう

では,作成したPerlアプリケーションをECSにデプロイしましょう。ECSでは,アプリケーションはタスク定義を用いて定義します。

ECSにおけるタスク定義は,docker-composeにおけるdocker-compose.ymlに該当する概念です。タスク定義は,タスクがどのようなコンテナを持ち,どのようなDockerイメージを使うのか,メモリやCPUリソースをどの程度割り当てるのかなどを定義します。そのタスク定義をインスタンス化し,ECSの基盤上に動作させたものがタスクです。

以降では,ECSにタスクをデプロイする方法を解説します。

ecs-cliコマンドのインストール

タスクのECSへのデプロイは,今回はAWSが提供しているecs-cliコマンドを用いて行います。公式ドキュメントを参考に,ecs-cliコマンド注5をインストールしておいてください。

プロファイルの設定

次に,ecs-cliコマンドが使うプロファイルを設定し,AWSにアクセスできるようにします。

$ ecs-cli configure profile \
  --profile-name プロファイル名 \
  --access-key $AWS_ACCESS_KEY_ID \
  --secret-key $AWS_SECRET_ACCESS_KEY
INFO[0000] Saved ECS CLI profile configuration プロファイル名.
ECSクラスタの作成

ECSクラスタを事前に作成しましょう。既存のクラスタを使う場合は,この作業は不要です。

$ ecs-cli up --vpc VPCのID \
  --subnets サブネットID[,サブネットID...] \
  --launch-type FARGATE \
  --region ap-northeast-1 \
  --cluster クラスタ名

このクラスタをecs-cliコマンドのデフォルトとして使うことを指定します。

$ ecs-cli configure \
  --cluster クラスタ名 \
  --default-launch-type FARGATE \
  --region ap-northeast-1 \
  --config-name クラスタ設定に付ける名前
Amazon ECSタスク定義の作成

そして,ecs-cliコマンドがどのクラスタをコンテナの起動先に指定するのか,どの起動タイプを選ぶのかをまとめた設定を,ecs-params.ymlに記述します。

version: 1
task_definition:
  # ↓あらかじめ実行ロールを作成しておくこと
  task_execution_role: ecsTaskExecutionRole
  ecs_network_mode: awsvpc
  task_size:
    mem_limit: 0.5GB
    cpu_limit: 256
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - "subnet-xxxxxx"
      security_groups:
        - "sg-xxxxxxxxxxxx"
      assign_public_ip: ENABLED

これで,ECSにタスクをデプロイし,パブリックIPアドレスを経由してアクセスする準備が整いました。

いざデプロイ

次のコマンドを実行すると,PerlアプリケーションがECSクラスタにデプロイされます。

$ ecs-cli compose \
  -f docker-compose-ecs.yml \
  --project-name サービスに付ける名前 service up \
  --create-log-groups \
  --cluster-config クラスタ設定名 \
  --ecs-profile プロファイル名

コンテナが動作しているかを確認しましょう。

$ ecs-cli compose \
  --project-name サービスに付けた名前 service ps \
  --cluster-config クラスタ設定名 \
  --ecs-profile プロファイル名
Name      State    Ports  TaskDefinition  Health
..../app  RUNNING  xxx.yyy.zzz.aaa:80->80/tcp  app:1  UNKNOWN

公開IPアドレスが表示されていればアプリケーションはECS上で動作しています。

$ curl http://xxx.yyy.zzz.aaa/
Hello, Plack!
注5)
執筆時点で最新のecs-cli 1.18.1を使用しています。

<続きの(2)こちら。>

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.119

2020年10月24日発売
B5判/160ページ
定価(本体1,480円+税)
ISBN978-4-297-11669-9

  • 特集1
    [古い技術,コードの重複,密結合]
    フロントエンド脱レガシー
    長く愛されるプロダクトをさらに改善していくために
  • 特集2
    インフラ障害対応演習
    「避難訓練」でいざに備える!
  • 特集3
    深層学習入門以前
    チュートリアルを動かす前に知っておくこと

著者プロフィール

野口啓介(のぐちけいすけ)

大学在学中に『はてなサマーインターン』に参加し,卒業後の2016年に株式会社はてなに入社。型のパワフルさを活かした開発が得意。

入社後はScalaによる『はてなブックマーク』のリプレイスメントプロジェクトや,『はてなブログ』の開発に参加。

アプリケーションエンジニアとしてバックエンド部分を主に担当しつつも,趣味で運用している自宅サーバで培ったインフラ寄りの知識でチームをサポートしている。

2018年8月より同社のマンガビューワの開発に携わっている。

GitHub:windymelt
Twitter:@windymelt
Hatena:id:Windymelt