Github Actions IAM Roleを利用してServerless Frameworkを動かす

この記事の要点

  • Github Actionsのワークフロー上で、アクセスキー、シークレットアクセスキーを使用せずIAM Roleの一時クレデンシャルでAWSリソースをデプロイ
  • Serverless Frameworkを使用するための連携方法

以上の備忘録になります

1. IAMロールの作成

まずはワークフロー上で使用するIAM Roleを準備します

CloudFormationテンプレートでOIDCプロバイダ、IAMポリシー、IAMロールを一括で作成します

<>内は置き換えて使用してください

IAMポリシーは検証用なのでフルアクセス権限を付与してますので、適宜変更してください

Parameters:
  GitHubOrg:
    Default: "<組織名>"
    Type: String
  RepositoryName:
    Default: "<リポジトリ名>"
    Type: String

Resources:
  Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Action: sts:AssumeRoleWithWebIdentity
            Principal:
              Federated: !Ref GithubOidc
            Condition:
              StringLike:
                token.actions.githubusercontent.com:sub: !Sub repo:${GitHubOrg}/${RepositoryName}:*

  Policy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: github-actions-oidc-policy
      Roles:
        - !Ref Role
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action: '*'
            Resource: '*'
        
  GithubOidc:
    Type: AWS::IAM::OIDCProvider
    Properties:
      Url: https://token.actions.githubusercontent.com
      ClientIdList: 
        - sts.amazonaws.com
      ThumbprintList:
        - 6938fd4d98bab03faadb97b34396831e3780aea1

Outputs:
  Role:
    Value: !GetAtt Role.Arn

AWS CLIを使用する場合は以下のようにデプロイできます

$ aws cloudformation deploy --template github-oidc-role.yml --stack-name GithubActionsOIDCRoleStack --capabilities CAPABILITY_IAM --profile <profile名>

2.Serverless Frameworkの初期構築

検証用のAWSリソースをServerless Frameworkで作成するための初期構築を行います

コマンドを入力するだけでサンプルリソースの定義が自動で作られるようです

// ライブラリのインストール
$ npm install -g serverless
// バージョン確認
$ serverless --version

$ cd serverless
$ npm install
// 初期構築
$ serverless create --template aws-nodejs-typescript --name serverless --path serverless

実行するとこの場合serverlessというディレクトリが作られ、その中に初期構築されたファイルが格納されます

–templateで言語を選ぶことができます

// デプロイを実行
$ serverless deploy --aws-profile <profile名> --region ap-northeast-1 --stage dev --verbose

–aws-profileでAWS CLIのprofileと同じようにクレデンシャルを設定できます

–verboseをつけると実行中のログが表示されます

provider: {
    name: 'aws',
    runtime: 'nodejs14.x',
    region: 'ap-northeast-1',
    stage: "${opt:stage, 'dev'}",
    apiGateway: {
      minimumCompressionSize: 1024,
      shouldStartNameWithService: true,
    },
    environment: {
      AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
      NODE_OPTIONS: '--enable-source-maps --stack-trace-limit=1000',
    },
  },

serverless.tsのproviderの設定にregion, stageなどを予め設定することでコマンドの設定を省くことができます

serverless frameworkの深堀りは今回の主題ではないので他記事を参照してください

$ serverless deploy --aws-profile <profile名> --verbose

// 削除したい場合
$ serverless remove --aws-profile <profile名>

3.Githubでの環境変数を設定

Githubコンソールで

Settings > Security > Actions を辿ると環境変数を設定できます

一応秘匿情報としてAWS_ACCOUNT_IDを設定します

4.Github Actions用テンプレートの用意

.github/workflows以下にYAMLファイルを格納することでGithub Actionsのワークフローを動かすことができます

name: actions-serverless

on:
  push:
    branches:
      - main

env:
  AWS_REGION: ap-northeast-1
  AWS_ROLE_ARN: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/<ロール名>

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [16.x]
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Configure AWS credentials from IAM Role
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - name: serverless deploy
        uses: serverless/github-action@v3.1
        with:
          args: -c "cd serverless/ && npm ci && serverless deploy"
          entrypoint: /bin/bash

5.ワークフロー実行

準備が出来たところでmainブランチにpushすることでワークフローが動きます

$ git add .
$ git commit -m "implement github actions pipeline"
$ git push origin main

参考記事

  • GitHub ActionsにAWSクレデンシャルを直接設定したくないのでIAMロールを利用したい

https://dev.classmethod.jp/articles/github-actions-aws-sts-credentials-iamrole/

  • Github Action for Serverless

https://github.com/serverless/github-action

無料相談実施中
AWSを使用したサーバーレスアプリケーションの構築
サーバーレス開発内製化、AWSへの移行等
様々な課題について無料でご相談お受けいたします。
最新情報をチェックしよう!