GitHub Actionsとは
GitHub ActionsはGitHubで使用することができるCI/CDツールです。
GitHub Actions は、ビルド、テスト、デプロイのパイプラインを自動化できる継続的インテグレーションと継続的デリバリー (CI/CD) のプラットフォームです。 リポジトリに対するすべての pull request をビルドしてテストしたり、マージされた pull request を運用環境にデプロイしたりするワークフローを作成できます。
実装
今回は以前CodePipelineで作成したCI/CD環境を、GitHub Actionsに置き換えて実装してみます。
なお、S3バケットは事前に以前と同じ設定値で準備しています。

※Codepipelineで作成した環境はこちら
認証情報の作成
AWSとGitHub Actionsでの認証方法として、以下のパターンを選択できます。
- OpenID Connect (OIDC)
- IAMユーザーのアクセスキー/シークレットアクセスキーを利用
セキュリティ的には一時的な認証情報を付与するOIDCが推奨されているため、こちらで実装を進めていきます。
手順
IDプロバイダの追加
-
以下の情報を入力し、「プロバイダを追加」を押下
IAMロールの作成
-
信頼されたエンティティタイプに「ウェブアイデンティティ」を選択し、以下の値を入力して次へ
-
追加するポリシーを選択して次へ
※今回はAmazonS3FullAccessを選択していますが、可能であれば権限は絞った方がよいです。

以上で、認証情報の作成は完了です。
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に入れなくてもよさそうですが、パブリックアクセスを禁止しているバケットであれば、ここで定義しておくと安心です。

-
AWS_ROLE_TO_ASSUME_ARN:作成したIAMロールのARN -
WEB_BUCKET_NAME:事前準備していたS3バケットの名前
また、定義したSecretsは${{ secrets.<変数名> }}で参照します。
動作確認
実際にmainブランチへプッシュして、リポジトリの資材がS3に同期されることを確認します。
GitHub Actionの実行結果は、GitHub > 対象リポジトリ > Actionsタブより確認が可能です。
下図のように成功したものと失敗したものがぱっと見で分かるようになっています。

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

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

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




