この記事の要点
- 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