[GitHub Actions] Arm64 ランナーでLambdaにコンテナをデプロイして料金削減する
概要
GitHub ActionsでArm64のランナーを使ってLambdaにコンテナイメージをデプロイするCICDを作成します
この記事を見てGithubActionsでArm64ランナーを使用すると料金を下げることができると知って実際にLambdaで試してみました
- この記事でのポイント
- Arm64ランナーでArmを対象にしたコンテナイメージを作成してLambdaで動作させる
- Arm64ランナーを使用することでGitHubActionsの料金を下げる
前提条件
今回はGitHubActionsでの運用料金を下げるためにArm64 ランナーを使いましたが料金削減するのには前提条件があります
- GitHubのTeam Plan, Enterprise Planを使用している
- 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=3000
で3000分まで追加料金なしで使用できますが、macosのランナーの場合 10×300=3000
で300分までしか追加料金なしで使用できません
- ここで本題の無料枠を超過していない場合Arm64ランナーにすると料金が上がってしまう理由はArm64ランナーが現状larger runnersというGithubのTeam Plan以上でないと使用できない機能であり、larger runnersは無料枠はなく有料だからです
- larger runnersに無料枠がないということは他の方の記事でも言及されております
そのため毎月無料枠で収まっている内は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 |
- こちらがArm64ランナーの料金です
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.005
で37%安くなっているのがわかります
弊社の場合Linux 2-core
で9,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 で作成するコードも含まれています
-
i-s-23/arm64-lambda-iac
-
今回作成するCICDの構成図
- PushをトリガーにしてECRにDockerfileをアップロードするCICDを作成します
larger runnersでArm64ランナーを作成する
- 以下の記事の手順で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ランナーを指定します
-
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%の料金削減が期待できる
参考資料
- GitHub Actions に Arm64 ランナーが来たので Docker のマルチプラットフォームイメージをビルドしてみる
-
About billing for GitHub Actions - GitHub Docs
- GithubActionsのRunnersの料金について
- larger runners
Discussion