Github Actions IAM Roleを利用してServerless Frameworkを動かす
この記事の要点
- ・Github Actionsのワークフロー上で、アクセスキー、シークレットアクセスキーを使用せずIAM Roleの一時クレデンシャルでAWSリソースをデプロイ
- ・Serverless Frameworkを使用するための連携方法
以上の備忘録になります
1.IAMロールの作成
まずはワークフロー上で使用するIAM Roleを準備します
CloudFormationテンプレートでOIDCプロバイダ、IAMポリシー、IAMロールを一括で作成します
<>内は置き換えて使用してください
IAMポリシーは検証用なのでフルアクセス権限を付与してますので、適宜変更してください
github-oidc-role.yml
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をつけると実行中のログが表示されます
serverless.ts
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のワークフローを動かすことができます
github-actions.yml
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