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

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

 

  • ・Serverless Frameworkを使用するための連携方法

以上の備忘録になります

まずはワークフロー上で使用する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名>

検証用の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名>

Githubコンソールで

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

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

.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

準備が出来たところで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