• Login
    • ログインしていません

  • Tool Set
    • 1ページ戻る

    • 1ページ進める

    • お気に入りに登録

    • しおりを挟む

  • Save
    • ページの復元をする

      サイトにアクセスした際に、前回閲覧していたページへ自動的に遷移するようにセットします。

  • Toppage Button
    • ボタンを非表示にする

  • Scroll Direction
    • ボタンによる
      スクロール方向を逆転

Others

  • HOME

  • Others

  • Googleドメイン + Route53 + S3 + CloudFront + GitHub Actions + Astroで行う静的サイト構築〜公開までの流れ
    その3:GitHub Actionsでデプロイできるようにしてみる

Googleドメイン + Route53 + S3 + CloudFront + GitHub Actions + Astroで行う静的サイト構築〜公開までの流れ
その3:GitHub Actionsでデプロイできるようにしてみる

これまでの記事の内容を進めていくことで、
1, S3バケットの用意
2, AWS CLIによるS3へのファイルのアップロード
ができるようになったと思います。

本記事では、
上記の設定を用いて、GitHubからS3へファイルが自動的にアップロードするための方法を解説していきたいと思います。

GitHubからS3へアップロードする

GitHubからS3へアップロードするには、
GitHub Actionsを用いてファイルをアップロードします。

  1. ローカル環境の変更をGitHubにプッシュする
  2. GitHubへのプッシュを受けてGitHub Actionsを起動する
  3. GitHub ActionsによってAWS CLIを実行する
  4. AWS CLIによってS3バケットへファイルのアップロードを行う

上記の一連の流れを自動化し、人の手を排除していきたいと思います。
この手法を「CI/CD」という言葉で表します。

CI/CDとは

Linux のディストリビューションを出しているRedHat社配下のように説明しています。

CI/CDとは、「Continuous Integration/Continuous Delivery」の略であり、日本語では継続的インティグレーション/継続的デリバリーと呼ばれています。
CI/CD は、アプリケーション開発の各ステージに自動化を導入し、顧客にアプリケーションを頻繁に提供できるようにする手法です。
Red Hat > DevOpsについて Red Hat: CI/CD とは

ここで聴きなれないワードが出てきました。
「継続的インティグレーション」と「継続的デリバリー」です。

継続的インティグレーションとは

インテグレーションという単語には、
統合する、一体化する、集積するなどの意味があり、
継続的インティグレーションというのは、
定期的に繰り返して一つにまとめるという意味を示しています。

継続的デリバリーとは

デリバリーという単語はそれほど難しくはなくそのままの意味で、
継続的デリバリーというのは
定期的に繰り返して配信・配達するという意味を表しています。

結果、何を表すのか

この「CI/CD」という言葉は何を意味しているかを簡単に表すと、
「開発者がソースコードをマージして一つにまとめ、その纏めた物をテストし、ビルドしたのちにある箇所に移動・配信することを繰り返す」ことを意味します。
で、実際に自身が受ける体験はどのようなものかというと、
「ソースコードを修正してGitHubにプッシュした時、master(main)にマージされたならば、テストを行い、本番用ファイルを生成し、本番環境にアップロードする」ことが自動で行なわれ、
「1回限りではなくプッシュされる度に同じ動作が実行される」という体験を享受することになります。

本題:GitHub Actionsを使用してS3バケットへファイルをアップロード(デプロイ)する

一つ前置きとして記載しておきますが、
GitHub ActionsからS3へのアップロードするには2通りあります。
1, IAMユーザーのクレデンシャル(鍵)をGitHubに登録してAWSにアクセスする方法
2, GitHubのOIDC(OpenIDConnect)情報をAWSに登録してAWSにアクセスする方法
前者はAWSの認証データをGitHubに預けてAWSの入口で確認する方法で
後者はAWSにGitHubの認証データを預けてAWSの入口で認証する方法になります。
セキュリティ的には後者の方が良いですが、
今回は前者の方法で進めさせていただきます。
前者はなぜセキュリティ的にダメなのかというと、
AWSのクレデンシャル情報を外に持ち出しているところにあります。
この点だけは注意しておいてください。

実際にする作業としては以下の流れになります。

  1. AWSのクレデンシャル情報をGitHubに登録する
  2. Workflow(Action)を定義する
  3. ファイルを修正してリポジトリへプッシュする

プッシュした後は自動で処理が進んでいくので、
GitHubのページからWorkflowがちゃんと動いていることを確認し、
Workflowの処理が完了したらS3バケットへファイルがアップロードされているかの確認を行うことになります。

AWSのクレデンシャル情報をGitHubに登録する

step1
S3バケットにアップロードしたいリポジトリのページを開き
「Settings」タブ → サイドメニュー「Secrets and variables」
 → アコーディオン内の「Actions」 をクリック

この時、リポジトリの公開設定が public であった場合、
Seacets は 「Environment secrets」 と 「Repository secrets」が表示されます。
今回は「Repository secrets」の方を利用します。

緑色の「New Repository Secrets」を押すことで登録画面に遷移します。

step2
こちらの画面でローカルからS3へアップロードする際に configure で登録した内容を設定していきます。
識別しやすいように
アクセスキーIDを「AWS_ACCESS_KEY_ID」
シークレットキーを「AWS_SECRET_ACCESS_KEY」という名で登録します。
※ ここで登録する鍵情報は、IAMユーザーの方を登録しましょう。

それでは、①に上記の名前を入力し、
②に鍵情報をコピーして貼り付けてましょう。
③で登録になります。

step3
右図下図のように登録されていれば問題ありません。

Workflow(Action)を定義する

Workflowではリポジトリに起こったアクションによって動作させることができる処理を登録します。
ローカル環境では、ビルドしてAWSCLIを使ってS3にアップしていた作業を、
workflowに時系列に沿って処理するように登録してみましょう。

workflowファイル(.yaml)を作成する方法は2種類あって、
1, GitHub上で作成する
2, リポジトリ内に直接ファイルを作成する
上記の2通りがあります。

画像では1のGitHub上での方法を紹介します。

step1
「Actions」タブ → 「set up a workflow yourself」リンクをクリックする。

step2
ファイル名は任意の名前で大丈夫です。
エディターエリアには何も入力されていないかと思いますが、
もし何か入っている場合は全て消しましょう。

step3
エディターエリアに右記下記の内容を貼り付けます。

こちらについて若干の解説を行います。

1行目
ActionsのWorkflow一覧に表示される名前になります。
2行目〜5行目
監視対象となるブランチを設定しています。コードでは「main」ブランチが対象になっています。
6行目〜8行目
ローカルでビルド・アップロードしたように、この作業を行うための環境を選択しています。皆さんはそれぞれPC(Mac, Windowsなど)を使って作業をしたかと思いますが、こちらでは「Linux Ubuntu の最新版」を使用します。
ここで選択したubuntu-latestには、初期状態でAWS CLIがインストールされているので、ローカルでインストールしたような作業は発生しません。
9行目〜24行目
時系列処理をStepsとして記載し処理を行なってい来ます。
10行目〜11行目
ローカルでブランチを切り替える操作を行うのと同じように、mainブランチにチェックアウトしています
12行目〜17行目
node_modulesをインストールし、ビルドを行います。
19行目〜24行目
envで使用するデータはあらかじめ、「AWSのクレデンシャル情報をGitHubに登録する」でSecretsに登録しているので、
データを引っ張ってくる際には「${{ secrets.XXXXXXX }}」の形で使用します。
データの左側のKeyはconfigureで聞かれる内容になっています。
AWS CLIのコマンドはローカルで実行したコマンドと一緒です
name: build and Deploy to S3
on:
  push:
      branches:
        - main
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@main  # リポジトリをチェックアウト

      - name: Install Dependencies
        run: yarn install

      - name: Build
        run: yarn build  # ビルド

      - name: Deploy  # S3にデプロイ 
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run:
          aws s3 cp dist/ s3://[S3バケットの名前]/ --recursive --region [S3バケットが作成されているリージョン]

こちらの .yaml ファイルを登録してプッシュした時点で、Actionsが動作します。
というのも、このファイルが登録されているブランチ自体が「main」ブランチの為、
2〜5行目に記載されているようにターゲットのブランチにプッシュされたら動作するようになっているので、
意図していないですが、動作検証のように動いてしまいます。

ファイルを修正してリポジトリへプッシュする

GitHub上でWorkflowの.yamlファイルを作成した場合、pullが必要になります。
ローカル開発環境でファイルを修正し、あらためてコミットをプッシュすると、
Actionが走るのを確認できると思います。
実際にActionが走った場合の画面を表示します。
成功した時(緑)、失敗した時(赤)は画像のようにアイコンで示されるので、
失敗した際はエラー内容を確認し、設定を修正して再度チャレンジしてください。
画像の失敗は、IAMユーザーのクレデンシャルを使用しているにもかかわらず、
S3へIAMユーザーのアクセス許可をおこなっていなかったために失敗しました。

まとめ

今回はIAMユーザーのクレデンシャル情報をGitHubに登録してCI/CDを行いました。
前の記事までの流れで、全てが揃っていたので、それほど難しくなかったと思います。
GitHubのOIDCを使ったS3へのアクセス→アップロードはまた機会があれば、
手順を解説していければと思います。

ubuntu-latestにインストールされているソフトウェアや機能の内容は下記になります。
気になる方は確認していただければと思います。
GitHub Actions Runner Images for ubuntu-latest at 230417

Drug用ハンドル