GitHub Actions × AWS で S3 & Lambda 自動デプロイを試してみた

DevOps

お疲れ様です。agiです。

今回は初めてGitHub Actionsを使ってみました、という内容です!

目的

GitHub Actionsを使って、リポジトリにpushしたら自動でAWS S3やLambdaにデプロイが行われるようにすること。テストコードはchatgptに書いてもらってます。

事前準備

  1. GitHubのリポジトリを作成(.github/workflows配下にymlファイルを設置、lambda配下にはlambda関数のコード、public配下にはS3のhtmlファイルを設置)
  2. 適当なLambda関数を作成
  3. S3バケットを作成し、Webサイトをホスティング設定する

※バケットポリシーと静的ウェブサイトホスティングの設定も忘れずにしておきます。

下記はS3のエンドポイントを開いた時の状況

手順

GitHubとAWSの連携(OIDC使用)

公式ではOIDC(OpenID Connect)を使った連携が推奨されています。

[参考URL]

OIDCとは?

OAuth2.0をベースにした認証プロトコルで、ユーザーの認証情報を安全にやり取りする仕組みです。 GoogleやLINEアカウントを使った他サービスへのログイン(SSO)に利用されています。

AWSのIAMロールに対してGitHubの認証サービスのドメインを指定してIdentity Providerを作成すると、GitHubの認証情報を使ってAWSリソースにアクセスできます。

IAMのIdentity providerを作成

  • Provider type:OIDC
  • Provider URLhttps://token.actions.githubusercontent.com
  • Audiencests.amazonaws.com
  • GitHub組織:自分のユーザー名
  • GitHubリポジトリ、ブランチ:自分が指定したいものを選択(空欄なら全てが対象になります)

IAMロールを作成

  • 信頼関係の設定で、上記で作成したOIDCを選択
  • S3、Lambdaへのアクセス権限を持つポリシーをアタッチ(一旦フルアクセス)
  • 作成後、ARNを控えておく

GitHub Actionsのワークフロー設置

  • .github/workflows/ 配下にYAMLファイルを作成
  • 以下の内容で作成しました(ChatGPTが生成)
name: Deploy static site & Lambda
on:
  push:
    branches: [ main ]

permissions:
  id-token: write
  contents: read

env:
  AWS_REGION: ap-northeast-1
  BUCKET: <YOUR-S3-BUCKET-NAME>
  FUNCTION_NAME: <YOUR-LAMBDA-NAME>

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::<ACCOUNT_ID>:role/<OIDC-ROLE-NAME>
          aws-region: ${{ env.AWS_REGION }}

      - name: Sync S3
        run: |
          aws s3 sync ./public s3://$BUCKET --delete

      - name: Update Lambda code
        run: |
          cd lambda
          zip -r ../lambda.zip .
          aws lambda update-function-code \
            --region $AWS_REGION \
            --function-name $FUNCTION_NAME \
            --zip-file fileb://../lambda.zip
  • GitHub Actionsの実行ユーザーはOIDCでIAMロールを引き受けてAWSリソースにアクセス
  • S3へのデプロイにはaws s3 syncを利用
  • Lambdaへのデプロイはzipファイルを作成後、aws lambda update-function-codeで更新

動作確認

  • mainブランチの内容を変更してコミット
  • pushするとGitHub Actionsが実行され、S3とLambdaにデプロイされるはずですが、、Actionsのタブを開くとworkflowsの実行結果を見ることができます。
  • S3バケットにアクセスしてindex.htmlが表示されることを確認
  • Lambda関数もAWSコンソールからコード更新を確認(今回空ファイルになっていたので、lambdaの初期コードが全部空っぽになっていました)
  • ということで、無事成功です!

学んだこと

  • AWSとGitHub Actionsの連携にはOIDCが安全で便利
  • GitHub Actionsのワークフローの書き方

今回初めてGitHubでCI/CDをちょこっと体験しましたが、非常に便利でした。 以前AWSのCodeシリーズで構築した際はIAM周りで非常に苦労しましたが、今回は特に詰まることなくスムーズにできました。 今後はGitHub Actionsを中心に使っていこうと思います!


DevOps
未経験から一人前のインフラエンジニアを目指すブログ