背景と実施したこと
GitHub Actionを仕事で初めて使いました。
最終的に実現したかったことはソースをGitHubにpushした際に自動でEC2(今回はWindowServer)にデプロイする、という動きです。
その際に調べたこと試したことを備忘的に残しておきます。
これから始めてGitHub Actionを使う人の助けになれば幸いです。
ちなみにですが、WindowsServer編と銘打っているもののLinux系とGitHub Actionsの処理はほとんど変わりません。
参考にした記事
GitHub ActionsでEC2に自動デプロイ環境を構築する方法
Github Actionsの使い方メモ
Github Actionsって何?
OpenSSH キーの管理
SSH接続先の情報をssh configに記載する
sshキー(秘密鍵・公開鍵)の作成と認証 流れ
概要
-
なんか難しいように感じるかもしれませんが、サーバ側でGitHubからpullする動きをSSH接続で実現するだけです。
-
GitHub ActionからSSHでEC2につなぎにいくため接続元IPは固定ではなく、つなぎ方に少し工夫が必要です。
前提
- クライアントPCからEC2までSSH接続できていること(秘密鍵の認証でもパスワード認証でもOK)
- EC2からGitHubにつないでソースをPullできること
- AWS CLIを使うためのキーがあること
※WindowsServerの場合はデフォルト設定のままではSSH接続できるようになっていないので要注意です。
GitHub Actionを実際に使ってみる。
GitHub Actionを使用するには、まず対象のリポジトリを選んで「Action」のタブに遷移します。
そうすると以下のようにいくつかテンプレートが出てきます。
(ymlで処理を記述するのがルール)
適当なものを選びcommitすると
.github\workflows
のパスにファイルができます。(もちろん自前で0から作ってもOK)
pullしてローカルの開発環境で実際にコードを書いてみます。
以下はただechoするだけのサンプルですが、pushしてみると起動することが確認できます。
※文法の細かい解説はここでは触れません。
公式ドキュメント以外では以下が参考になりました。
Github Actionsの使い方メモ
Github Actionsって何?
name: Deploy to Amazon
on:
push:
branches:
- main
jobs:
Test:
name: Test
runs-on: ubuntu-latest
steps:
- name: echoTest
run: echo "Test"
EC2にデプロイするまでのコード
name: Deploy to Amazon
on:
push:
branches:
- main
jobs:
Test:
name: Test
runs-on: ubuntu-latest
steps:
- name: echo1
run: echo "this is a pen"
# IP取得ライブラリをインストール
- name: Public IP Install
id: ip
uses: haythem/public-ip@v1.2
- name: checkout
uses: actions/checkout@v3
- name: src check
run: |
ls -al
cd .github/workflows/
ls -al
# AWS CLIをインストールする
- name: AWS CLI install
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
aws --version
# AWS CLIにキーを設定をする
- name: AWS set Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
# デプロイする
- name: Deploy
run: |
# SSHのセキュリティグループを開放する
aws ec2 authorize-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
# SSH接続して、git pullする
echo "${{ secrets.MY_PRIVATE_KEY }}" > private_key
chmod 600 private_key
# 鍵認証の場合はこんな感じ
ssh -oStrictHostKeyChecking=no ${{ secrets.EC2_USER_NAME }}@${{ secrets.EC2_HOST_NAME }} -i private_key "cd C:\inetpub\test\github-action-sample && git pull origin main"
# パスワード認証の場合はこんな感じ
sshpass -p "${{ secrets.ADM_PASS }}" ssh -oStrictHostKeyChecking=no ${{ secrets.EC2_USER_NAME }}@${{ secrets.EC2_HOST_NAME }} "cd C:\inetpub\test\github-action-sample && git pull origin main"
# pullした後は任意の処理を走らせる
# SSHのセキュリティグループを閉じる
aws ec2 revoke-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
コードの大部分は
GitHub ActionsでEC2に自動デプロイ環境を構築する方法
の記事を参考にさせていただきました。
ところどころsecretsから値を取得している部分がありますが、これは
以下の画面から設定・取得できます。
また上記の参考記事にも記載があるのですが
GitHub ActionからSSHで接続する都合上、都度セキュリティグループに対してIPを教えて開放・処理が終わったら閉じる、ということをする必要があります。
この点は要注意ですね。
まとめ
以上、ごく簡単にではありますが、GitHub ActionからEC2にデプロイするまでの流れでした。
Circle CIなどのサービスもありますが、小規模開発や複雑な処理がない場合はGitHub Actionだけでよいように思えました。
Vercelなんかは小難しい設定をすることなくこれを実現できていると考えるとすごいですね。
また今回はCI/CDでいうとCDの部分だけがクリアできたことになります。
以降はCIの部分にも挑戦していきたいと思います。