Open4

EC2環境 デプロイ自動化

まさきちまさきち

概要

EC2環境のデプロイ自動化のノウハウをまとめておく。
Docker + Github Actionを使用



要件

  • 自動デプロイは、一連のテストとバリデーションが通った後に行われる必要がある。
  • バリデーション不通化の場合は、slackに通知される。
  • 最新のGitを更新している、buildが完了している。
  • スクリプトがEC2にアクセスしてデプロイを行う場合、セキュリティと認証の問題を慎重に検討する。
  • 予期せぬダウンタイムを避ける。



実装手順

  • githubとAWS EC2の接続設定:GithubのリポジトリにSSH接続できるように設定
  • GitHub Actions 自動デプロイ処理:Secretsを活用して機密情報を格納
  • Workflow生成
  • on.scheduleを設定して、特定の時間に更新する
on:
  schedule:
    - cron: '0 22 * * *'
  • スクリプトの作成(BashやPythonなどのスクリプト言語を使用しデプロイスクリプトを作成)
  • cronジョブの設定を行い定期的に実行スクリプト内でSSH接続、Git pull、npmコマンドなどを実行
crontab -e
0 22 * * * /path/to/your-script.sh

https://qiita.com/shuncask/items/db41ec7cc4d4f23b1a28

まさきちまさきち

ワークフローをトリガーにするイベントについて

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#about-events-that-trigger-workflows



schedule

schedule イベントを使うと、スケジュールした時刻にワークフローをトリガーできる。
ワークフローは毎日UTCの5:30と17:30にトリガーする例

on:
  schedule:
    # * is a special character in YAML so you have to quote this string
    - cron:  '30 5,17 * * *'


毎週月曜日から木曜日の 5 時 30 分 (UTC) にワークフローが実行されるが、月曜日と水曜日の Not on Monday or Wednesday 手順はスキップされる例。

on:
  schedule:
    - cron: '30 5 * * 1,3'
    - cron: '30 5 * * 2,4'

jobs:
  test_schedule:
    runs-on: ubuntu-latest
    steps:
      - name: Not on Monday or Wednesday
        if: github.event.schedule != '30 5 * * 1,3'
        run: echo "This step will be skipped on Monday and Wednesday"
      - name: Every time
        run: echo "This step will always run"

スペースで分けられた 5 つのフィールドがあり、各フィールドは時間の単位を表す。

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *
まさきちまさきち

GitHub Actionsの基本

  • ワークフロー:リポジトリ内のソフトウェア開発における何かしらのプロセスを自動化したもの
     → 一つ以上の複数のジョブから構成される。
  • ジョブ:ワークフロー内のタスクを実行(並列実施・依存関係を持たせることが可能)
     → ジョブは複数のステップから構成される。
  • ステップ:何かしらのコマンド実行かアクションの呼び出し。
  • アクション:GithubActionsが適用する処理の塊


ワークフローファイルの保存場所

.github/workflows


ワークフローの仮想環境

GitHub Actionsの実行環境はVM(仮想マシン)環境と、ユーザーが構築した独自の環境が使用できる。


Dockerイメージをアクションとして実行する

- uses: docker://alpine:3.11


複数のコマンドを実行する

- run:  |
      npm ci
      npm test


コマンド実行のワーキングディレクトリを変更できる


- run:  |
      pwd
      ls
      workingdirectory:/tmp


機密情報をワーキングフロー内で使用する

steps:
    - run: echo "${{secrets.SECRET_TOKEN}}"


マトリクスビルド

複数のOSやバージョンの組み合わせ

jobs:
  example_matrix:
    strategy:
      matrix:
        version: [10, 12, 14]
        os: [ubuntu-latest, windows-latest]

https://qiita.com/shun198/items/14cdba2d8e58ab96cf95



Composite Actionについて

https://zenn.dev/tmknom/books/pragmatic-composite-action