0
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からLambdaをデプロイする方法

0
Posted at

はじめに

最近、会社でGitHubを使ってコードを管理するようになった。管理しているコードはLambdaにデプロイしているものがほとんど。現状の開発の流れとしては「ローカルで作成・テスト」⇒「GitHubにコミット」⇒「コードをコピペしてコンソールからLambdaを作成」となっており、このコピペの作業が煩わしかった。GitHubから直接コードをデプロイする方法があると聞き、まずはGitHub Actionsから調べてみた。

GitHub Actionsとは

GitHub Actionsはビルドやテスト、パッケージング、デプロイなどを行うワークフローを作成し、それを実行するGitHubのサービス。ワークフローはリポジトリごとに設定でき、プッシュやプルリクエスト、Issue作成などのイベントをトリガーに実行される。GitHub ActionsはGitHubが用意している実行環境、もしくは自分たちが用意した実行環境上で実行できる。GitHub上の実行環境ではデフォルトはLinux(ubuntu)で用意されているが、自分たちの開発しているアプリによって他のOS(MAC、Windows)も指定することができる。

GitHubからLambdaをデプロイする

AWS側の設定

GitHubからAWS上のLambdaにデプロイするためには、GitHubが接続できるようにIAMロールの準備などが必要。まずはGitHub ActionsがAWSにアクセスする際に発行するOIDCトークンを受け取れるように設定する。

  1. IAMにアクセスしIDプロバイダーからプロバイダーを追加を選択し、プロバイダのタイプとして「OpenID Connect」を選択する。そして、プロバイダーのURLとして「https://token.actions.githubusercontent.com
    」を入力し、対象者として「sts.amazonaws.com
    」を入力する。
    image.png
    プロバイダーのURLはOIDCトークンを受け取るためのエンドポイントで、対象者にはそのトークンを何に使うかを示している。これを設定情報を使ってAWS側でGitHubからのトークンを検証している。

  2. GitHub Actions用のIAMロールを作成する。アイデンティティプロバイダーに先ほど作成したGitHub用のプロバイダーを選択し、Audienceとしてstsを選択。GitHub orginizationには使う予定のリポジトリのオーナーとしてユーザー名もしくはOrganizations名、そして必要であればリポジトリ名を入れる。
    image.png

  3. 先ほど作成したIAMロールにポリシーを設定する。デプロイに必要なUpdateFunctionCodeUpdateFunctionConfigurationGetFunctionを付与している。ResourceにはデプロイするLambdaを指定する。今回作成したポリシーは以下の通り。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
				"lambda:UpdateFunctionCode",
				"lambda:UpdateFunctionConfiguration",
				"lambda:GetFunctionConfiguration"
            ],
            "Resource": [
                "arn:aws:lambda:ap-northeast-1:<ACCOUNT_ID>:function:test-lambda-1",
                "arn:aws:lambda:ap-northeast-1:<ACCOUNT_ID>:function:test-lambda-2"
            ]
        }
    ]
}

GitHub側の設定

GitHub Actions用のワークフローを作成する。ワークフローはYAMLで作成する。

name: test-lambda-deploy

on: [push]

jobs:
  deploy: 
    runs-on: ubuntu-latest
    permissions: 
      id-token: write
      contents: read
    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/<ROLE_NAME>
            aws-region: ap-northeast-1
        - name: Deploy Lambda Function 1
          uses: aws-actions/aws-lambda-deploy@v1
          with: 
            function-name: test-lambda-1
            code-artifacts-dir: ./lambdas/test-lambda-1
        - name: Deploy Lambda Function 2
          uses: aws-actions/aws-lambda-deploy@v1
          with: 
            function-name: test-lambda-2
            code-artifacts-dir: ./lambdas/test-lambda-2
設定項目 内容
name ワークフロー全体の名前。
on ワークフローの起動タイミング。PR作成や定期実行などもある。
jobs ワークフローの中で動かすジョブ。
┗ deploy 1つのジョブのまとまり。
 ┗ runs-on ジョブを実行する際のOS、Linux, MAC, Windowsが指定可能。
 ┗ permissions ワークフローが使うGitHubトークンの権限設定。
  ┗ id-token OIDCトークンを発行する許可を与える。none, read, writeが指定でき、発行するにはwrite。
  ┗ contents リポジトリのコンテンツへのアクセス設定。none, read, writeが指定でき、リポジトリを読むだけならread。
 ┗ steps ジョブの中で実行する処理のリスト。
  ┗ name ステップの表示名。ログなどに出る。省略可能。
  ┗ uses 既存のアクションを呼び出す。
  ┗ with アクションに渡す入力パラメーター。

今回のワークフローの流れとしては、まず現在のリポジトリをランナー上にコピーする(actions/checkout@v4)。次にAWSにアクセスするための認証情報を取得している。ここでOIDCトークンを使ってAWSに用意したIAMロールのAssumeRoleを実施している(aws-actions/configure-aws-credentials@v4)。そして、取得した認証情報を使ってランナー上にコピーしたコードをLambdaにデプロイしている(aws-actions/aws-lambda-deploy@v1)。

実行結果

GitHub上でどのようにデプロイが進んでいるか確認することができる。

image.png

AWSコンソールから該当するLambdaのコードを確認するとPushしたコードが反映されていた。
また、権限が足りていない場合など何かエラーが発生した場合もここに表示される。以下はIAMロールにGetFunctionConfigurationが足りていなかった場合のエラー。

image.png

まとめ

GitHub ActionsからLambdaをデプロイする方法を確認した。もちろんLambda以外にもAWS CDKで作成したコードからリソースをデプロイすることもできる。

0
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
0
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?