🛠️

[GitHub Actions] Arm64 ランナーでLambdaにコンテナをデプロイして料金削減する

2024/06/12に公開

概要

GitHub ActionsでArm64のランナーを使ってLambdaにコンテナイメージをデプロイするCICDを作成します

この記事を見てGithubActionsでArm64ランナーを使用すると料金を下げることができると知って実際にLambdaで試してみました


  • この記事でのポイント
    • Arm64ランナーでArmを対象にしたコンテナイメージを作成してLambdaで動作させる
    • Arm64ランナーを使用することでGitHubActionsの料金を下げる

前提条件

今回はGitHubActionsでの運用料金を下げるためにArm64 ランナーを使いましたが料金削減するのには前提条件があります

  1. GitHubのTeam Plan, Enterprise Planを使用している
  2. GitHubActionsの無料枠を超過している(毎月3000ms分貰える実行時間)

注意点としてActionsの使用量が無料枠を超過していない場合はArm64ランナーにすると、むしろ料金が上がってしまいます

GithubActionsの無料枠についての詳細

GithubActionsはPlanによって月毎に一定時間の無料枠が付与されます

Plan Storage Minutes (per month)
GitHub Free 500 MB 2,000
GitHub Pro 1 GB 3,000
GitHub Free for organizations 500 MB 2,000
GitHub Team 2 GB 3,000
GitHub Enterprise Cloud 50 GB 50,000

例えば組織でGithubのTeam Planを契約していれば月に3000分まではGithubActionsを追加料金なしで使用できる。といった具合です

また3000分まで追加料金なしといってもランナーに使用するOSによって請求時間の消費量が異なるため必要です

Operating system Minute multiplier
Linux 1
Windows 2
macOS 10

例えばLinuxのランナーを使用した場合 1×3000=30003000分まで追加料金なしで使用できますが、macosのランナーの場合 10×300=3000300分までしか追加料金なしで使用できません


そのため毎月無料枠で収まっている内はArm64ランナーにするとむしろ料金が上がってしまう。ということです。(今後GithubActionsのアップデートでlarger runners以外でもArm64ランナーが使えるようになることに期待したいです!)

どれくらい安くなるのか?

Operating System Per-minute Rate (USD)
Linux 2-core $0.008
Windows 2-core $0.016
macOS 3 or 4 (M1 or Intel) $0.08
Operating System Per-minute Rate (USD)
Linux 2-core $0.005
Linux 4-core $0.01
Linux 8-core $0.02
Linux 16-core $0.04
Linux 32-core $0.08
Linux 64-core $0.16
Windows 2-core $0.01
Windows 4-core $0.02
Windows 8-core $0.04
Windows 16-core $0.08
Windows 32-core $0.16
Windows 64-core $0.32
macOS 6-core (M1) $0.16

Linux 2-coreの料金で比較すると$0.008$0.00537%安くなっているのがわかります

弊社の場合Linux 2-core9,498分の請求時間なので月に$75の料金がかかっていました
仮にこれをLinux Arm64 2-coreに変更すると$47になります

月あたり$28 安くなる計算です。
そこそこな節約になることが理解できたと思います。

動作環境

  • GitHub

    • larger runners 機能を使えるのは Team Plan 以上のプライベートリポジトリ
  • GitHubActions

  • AWS

  • DevContainers(Github ActionsのVSCode拡張機能など入れてます)

  • サンプル

    • i-s-23/arm64-lambda-iac
      • 今回使用するCICDのコードはこのリポジトリにあります。LambdaなどAWSリソースをTerraform で作成するコードも含まれています
  • 今回作成するCICDの構成図

    • PushをトリガーにしてECRにDockerfileをアップロードするCICDを作成します

larger runnersでArm64ランナーを作成する

注意すべき箇所は New Self-hosted runner ではなく New GitHub-hosted runner を選択することと、Platformで Linux ARM64 を選択することです。

名前は記事の通りスペックの内容を記載した ubuntu-22.04-2core-arm64 にするのがわかりやすくていいと思います

Arm64ランナーを使用したCICDコード

  • 基本的には標準ランナーの時と同じコードです
    • runs-on: ubuntu-22.04-2core-arm64 (先ほど作成したlarger runnersの名称)でArm64ランナーを指定します
.github/workflows/docker-push.yml
name: Docker Build and Push

on:
  push:
    branches:
      - main
    paths:
      - 'src/lambda-test/**' # LambdaのソースコードやDockerfileが変更されたときのみCICDを実行する

jobs:
  build:
    runs-on: ubuntu-22.04-2core-arm64 # CICD料金を下げるためarm64のlerger-runnerを使用
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v4
      - name: Configure AWS credentials # AWSの認証をOIDCで行う
        uses: aws-actions/configure-aws-credentials@v4.0.1
        with:
          role-to-assume: ${{ secrets.AWS_IAM_ROLE_ARN }}
          aws-region: ${{ vars.AWS_REGION }}
      - uses: aws-actions/amazon-ecr-login@v2.0.1 # ECRにログイン
        id: login-ecr
      - name: Set up buildx # ビルドキャッシュを使用するためにbuildxをセットアップ
        uses: docker/setup-buildx-action@v3.0.0
      - run: echo "REPOSITORY_NAME=${GITHUB_REPOSITORY#${GITHUB_REPOSITORY_OWNER}/}" >> $GITHUB_ENV
      - name: Set up meta data # コンテナのTagやECRのPush先を設定
        id: meta
        uses: docker/metadata-action@v5.3.0
        with:
          images: |
            ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}
          tags: |
            value=latest
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: lambda-test
      - name: docker build and push ECR # DockerイメージをビルドしてECRにPush
        uses: docker/build-push-action@v5.1.0
        with:
          context: src/lambda-test # Dockerfileのあるディレクトリ
          platforms: arm64 # Arm64のイメージをビルド
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          # Actionsで使用するCacheの設定
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false
      - name: update lambda function # LambdaにECRのイメージをデプロイ
        run: |
          aws lambda update-function-code --function-name ${{ env.FUNC_NAME }} --image-uri ${{ env.IMAGE_URI }}
        env:
          FUNC_NAME: lambda-test
          IMAGE_URI: ${{ steps.login-ecr.outputs.registry }}/lambda-test:lates

結果

CICDの実行時間も以下の通りで、Arm64にしたら7秒速くなった程度なので問題なさそうです

LambdaのDockerコンテナは正常に動作していることがわかります(設定した環境変数の内容を返しているため)

料金の箇所を見ると以前と比較してArm64が新たに追加されていることがわかります。arm64は$0.003安いので、今回2分の請求時間なので$0.006安く実行できました。

  • before
  • after

まとめ

GithubActionsの無料枠を超過している場合、Arm64ランナーにすることで37%の料金削減が期待できる

参考資料

SocialPLUS Tech Blog

Discussion