こんにちは、ちゃりおです。
先日、OIDCを使ってGithubActionsにIAMロールを渡してAWS上の操作ができるようになりました。
今までは、IAMのアクセスキーを使ってGithubActionsにセットする必要がありました。
しかし、IAMのアクセスキーの管理など手間が発生していました。
今回のアップデートで、IAMのアクセスキーを発行することなく一時的なクレデンシャルを使ってAWSの操作ができるようになりました。
この機能かなり便利ですよね。
CDK書くのが面倒で、なにか楽な方法ないかと思っていたら以下のツイートが流れてきました。
Here is the demo – Github OIDC identity provider with AWS CDK and Projen to automate a object upload and URL presigning Github workflow. No static credentials required anymore. Sweet! 🥰 https://t.co/Vrfzfz7qrT pic.twitter.com/rpc3JWttFG
— Pahud Hsieh (@pahudnet) November 4, 2021
CDKのConsructHubに「aws-cdk-github-oidc」という便利そうなものがあった!
ブログにしてみます。
デモ
とりあえず、pahudnetさんのスクショの通りやってみます。
# CDK
import * as cdk from '@aws-cdk/core';
import { CfnOutput } from '@aws-cdk/core';
import { Bucket } from '@aws-cdk/aws-s3';
import { GithubActionsIdentityProvider, GithubActionsRole } from 'aws-cdk-github-oidc';
export class CdkGithubOidcSampleStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const provider = new GithubActionsIdentityProvider(this, "Provider")
const role = new GithubActionsRole(this, "UploadRole", {
provider,
owner: "msato0731",
repo: "cdk-github-oidc-demo",
})
new CfnOutput(this, "RoleArnOutputs", { value: role.roleArn })
const bucket = Bucket.fromBucketName(this, "Bucket", "cdk-github-oidc-demo")
bucket.grantReadWrite(role)
}
}
providerとroleのところが簡単にかけますね。
#GithubActions
name: demo
on:
workflow_dispatch:
jobs:
deploy:
name: Upload to Amazon S3
runs-on: ubuntu-latest
permissions:
id-token: write # needed to interact with GitHub's OIDC Token endpoint.
contents: read
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@master
with:
role-to-assume:
aws-region: ap-northeast-1
- name: Sync files to S3
run: |
aws s3 sync . s3://cdk-github-oidc-demo
成功することを確認できました。
作成されるリソースを見てみる
GithubのIDプロパイダが作成されました。
信頼関係のところも、自分ではownerとrepoしか書きませんでしたが、自動的に入れてくれています。
既存のProviderを割り当てる
Providerはアカウントに一つしか作れないため、既存のProviderを使いたいときがあると思います。
以下のようにfromAccountを使えば可能です。
const provider = GithubActionsIdentityProvider.fromAccount(this, 'GithubProvider');
参考
Configuring OpenID Connect in Amazon Web Services