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
ワークフローをトリガーにするイベントについて
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)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *
Using Docker Containers with GitHub Actions
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]
Composite Actionについて