1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実践!GitHub ActionsでCI/CDやってみる

Posted at

GitHub Actionsとは

GitHub ActionsはGitHubで使用することができるCI/CDツールです。

GitHub Actions は、ビルド、テスト、デプロイのパイプラインを自動化できる継続的インテグレーションと継続的デリバリー (CI/CD) のプラットフォームです。 リポジトリに対するすべての pull request をビルドしてテストしたり、マージされた pull request を運用環境にデプロイしたりするワークフローを作成できます。

実装

今回は以前CodePipelineで作成したCI/CD環境を、GitHub Actionsに置き換えて実装してみます。
なお、S3バケットは事前に以前と同じ設定値で準備しています。
githubcicd.png

※Codepipelineで作成した環境はこちら

認証情報の作成

AWSとGitHub Actionsでの認証方法として、以下のパターンを選択できます。

  • OpenID Connect (OIDC)
  • IAMユーザーのアクセスキー/シークレットアクセスキーを利用

セキュリティ的には一時的な認証情報を付与するOIDCが推奨されているため、こちらで実装を進めていきます。

手順

IDプロバイダの追加
  1. IAM > IDプロバイダから「プロバイダを追加」を押下
    image.png

  2. 以下の情報を入力し、「プロバイダを追加」を押下

    • プロバイダのURL:https://token.actions.githubusercontent.com
    • 対象者:sts.amazonaws.com
      image.png
IAMロールの作成
  1. IAM > ロール から「ロールを作成」を押下
    image.png

  2. 信頼されたエンティティタイプに「ウェブアイデンティティ」を選択し、以下の値を入力して次へ

    • アイデンティティプロバイダー:token.actions.githubusercontent.com
    • Audience:sts.amazonaws.com
    • GitHub organization:<対象organaization名>
    • GitHub repository:<対象リポジトリ名>
    • GitHub branch:<対象のブランチ名>
      image.png
  3. 追加するポリシーを選択して次へ
    ※今回はAmazonS3FullAccessを選択していますが、可能であれば権限は絞った方がよいです。
    image.png

  4. 任意のロール名を入力した後、「ロールの作成」を押下
    image.png

以上で、認証情報の作成は完了です。

workflowファイルの作成

GitHub Actionsの動作には 以下のworkflowファイルが必要となります。
.github/workflows/<任意の値>.yml

こちらのファイルに、CI/CDのトリガーや処理内容を定義していくこととなります。
今回はS3バケットへのデプロイですので、以下のようにしました。

name: Deploy to S3

on:
  push:
    branches: [ "main" ]

env:
  AWS_REGION: ap-northeast-1

permissions:
  id-token: write   # This is required for requesting the JWT
  contents: read    # This is required for actions/checkout

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Git clone the repository
      uses: actions/checkout@v6

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v5.1.1
      with:
        aws-region: ${{ env.AWS_REGION }}
        role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME_ARN }}
        role-session-name: ${{ github.run_id }}

    - name: Deploy to S3
      run: |
        aws s3 sync ./ s3://${{ secrets.WEB_BUCKET_NAME }} --exclude ".git/*" --exclude ".github/*" --delete

詳細は省略しますが、このworkflowでは、mainブランチへのプッシュをトリガーにS3バケットへの同期を実施します。
秘匿情報については、GitHubのSettingsからSecretsに定義しています。
今回はWeb公開用のため、S3バケット名はSecretsに入れなくてもよさそうですが、パブリックアクセスを禁止しているバケットであれば、ここで定義しておくと安心です。
image.png

  • AWS_ROLE_TO_ASSUME_ARN:作成したIAMロールのARN
  • WEB_BUCKET_NAME:事前準備していたS3バケットの名前

また、定義したSecretsは${{ secrets.<変数名> }}で参照します。

動作確認

実際にmainブランチへプッシュして、リポジトリの資材がS3に同期されることを確認します。
GitHub Actionの実行結果は、GitHub > 対象リポジトリ > Actionsタブより確認が可能です。
下図のように成功したものと失敗したものがぱっと見で分かるようになっています。
image.png

詳細のログを確認すると、Secretsの値はマスクされていることがわかります。
image.png

AWSコンソール上でも空のS3バケットにindex.htmlが同期されていました。
image.png

まとめ

GitHub ActionsはAWS CodePipelineに比べて管理対象が少なく、実行結果もリポジトリ上から簡単に追えるのが魅力的だなと感じました。
GitHubのリポジトリを使用していて、CI/CDを組み込む場合はまず選択肢の1つに挙がりそうです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?