Githubアクションによる安全なAWS - CDK展開


Githubアクションは連続的な統合を可能にし、AWS CDKはインフラストラクチャをコードとして有効にします.
このガイドでは、AWSのアカウントにGithubアクションからAWSのCDKスタックの展開を自動化する安全な方法を提供します.
あなたのGitHubアカウントで長寿命の資格情報を保存する必要がないので、より安全です👍
  • 当初出版here
  • 関連文書
  • GitHub open ID connect
  • Using open ID connect with AWS IAM

  • 動作方法
    私たちはオープンID接続を利用し、Githubに一時的な同盟国を与えます.このアイデンティティはあなたのAWSアカウントの役割を仮定するために信頼されるでしょう.
    アイデンティティ(GITHUB)が役割を仮定するとき、我々は2つのことをすることによってそれのアクセスを確保します:
  • 一時的なAWS秘密キーとアクセスキーを与えることは、1時間で期限が切れます.
  • JTWUBによるJWTからAWSへのクレームを使用して、許容されるIDの範囲を狭める.

  • セットアップ
    そうすれば、
  • AWS CDKスタックを使用して、アイデンティティプロバイダーと信頼関係を作成する1回のGithubアクション.
  • アイデンティティを使用して一時的なアクセスを得、AWSのCDKスタックを展開します.

  • ブートストラップスタックの作成
    新しいAWS CDKアプリケーションを作成できます.
    mkdir bootstrap
    
    npx [email protected] init app --language typescript
    
    その後、IAMから2つのコンポーネントを使用してプロバイダーを作成し、プリンシパルを作成します.
    私たちは、AWSの間の信頼関係を作成するためにプリンシパルを使用するでしょう、そして、そのようにgithub.
    /**
     * Create an Identity provider for GitHub inside your AWS Account. This
     * allows GitHub to present itself to AWS IAM and assume a role.
     */
    const provider = new OpenIdConnectProvider(this, 'MyProvider', {
      url: 'https://token.actions.githubusercontent.com',
      clientIds: ['sts.amazonaws.com'],
    });
    
    そして、このプロバイダーが元本として行動するための条件を定義することで、信頼関係を確立する.
    私はあなたを仮定する例を提供しますhttps://github.com/simonireilly そして、あなたは素晴らしいプロジェクトと呼ばれる
    const githubOrganisation = "simonireilly"
    // Change this to the repo you want to push code from
    const repoName = "awesome-project"
    /**
     * Create a principal for the OpenID; which can allow it to assume
     * deployment roles.
     */
    const GitHubPrincipal = new OpenIdConnectPrincipal(provider).withConditions(
      {
        StringLike: {
          'token.actions.githubusercontent.com:sub':
            `repo:${githubOrganisation}/${repoName}:*`,
        },
      }
    );
    
    最後に、OIDCプリンシパルによって想定できるロールを確立します.これによって、githubのアクションがAWSロールを使用し、AWSリソースを展開してアクセスできます.
    /**
      * Create a deployment role that has short lived credentials. The only
      * principal that can assume this role is the GitHub Open ID provider.
      *
      * This role is granted authority to assume aws cdk roles; which are created
      * by the aws cdk v2.
      */
    new Role(this, 'GitHubActionsRole', {
      assumedBy: GitHubPrincipal,
      description:
        'Role assumed by GitHubPrincipal for deploying from CI using aws cdk',
      roleName: 'github-ci-role',
      maxSessionDuration: Duration.hours(1),
      inlinePolicies: {
        CdkDeploymentPolicy: new PolicyDocument({
          assignSids: true,
          statements: [
            new PolicyStatement({
              effect: Effect.ALLOW,
              actions: ['sts:AssumeRole'],
              resources: [`arn:aws:iam::${this.account}:role/cdk-*`],
            }),
          ],
        }),
      },
    });
    
    🚨 これらのアクセス許可はあなたのユースケースに対してあまりにも広いかもしれません.アクセス許可の境界を追加するか、CDKがその展開に自動的に作成したロール以外のロールを使用することを選択します🚨

    ブートストラップの配備
    作成されたアクセスキーのセットを使用すると、ブートストラップを展開できます.これはあなたのチームのリンクを設定するより高い特権を持つ誰かを可能にします👍
    これはGithubで長生きした資格情報を格納することを保持します.
    name: Bootstrap
    on:
      workflow_dispatch:
        inputs:
          AWS_ACCESS_KEY_ID:
            description: "Access Key ID with Permissions to deploy IAM, and OIDC"
            required: true
          AWS_SECRET_ACCESS_KEY:
            description: "Secret Access Key with Permissions to deploy IAM, and OIDC"
            required: true
          AWS_REGION:
            description: "Region to deploy to."
            required: true
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
          - name: Git clone the repository
            uses: actions/checkout@v1
    
          - name: Configure aws credentials
            uses: aws-actions/configure-aws-credentials@master
            with:
              aws-access-key-id: ${{ github.event.inputs.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ github.event.inputs.AWS_SECRET_ACCESS_KEY }}
              aws-region: ${{ github.event.inputs.AWS_REGION }}
    
          - uses: actions/setup-node@v2
            with:
              node-version: "14"
    
          - run: yarn install
    
          - name: Synth stack
            run: yarn --cwd packages/bootstrap cdk synth
    
          - name: Deploy stack
            run: yarn --cwd packages/bootstrap cdk deploy --require-approval never
    
    このアクションをトリガーすると、ユーザーはAWSアクセスキーとAWS秘密を入力しなければなりません.


    ポストブートストラップライフ
    このスタックを使用すると、信頼できるリポジトリからリンクされたAWSアカウントにAWS CDK V 2展開を出荷することができます.
    あなたがしなければならないすべては、あなたのアカウントでGithub CI役割役割を仮定するためにGitHubアクションを指示して、1時間の一時的な資格を得るでしょう.
      deploy-infrastructure:
        runs-on: ubuntu-latest
        permissions:
          id-token: write
          contents: read
        steps:
          - name: Git clone the repository
            uses: actions/checkout@v1
    
          - name: Assume role using OIDC
            uses: aws-actions/configure-aws-credentials@master
            with:
              role-to-assume: arn:aws:iam::<your-account-id-here>:role/github-ci-role
              aws-region: ${{ env.AWS_REGION }}
    
          - uses: actions/setup-node@v2
            with:
              node-version: "14"
    
          - run: yarn install
    
          - name: Synth infrastructure stack
            run: yarn --cwd packages/infrastructure cdk synth
    
          - name: Deploy infrastructure stack
            run: yarn --cwd packages/infrastructure cdk deploy --require-approval never
    

    次のステップは
    別のブートストラップを作成します.main ブランチは、あなたが1つを持っている場合、あなたの生産👍
    {
      StringLike: {
        'token.actions.githubusercontent.com:sub':
          `repo:${githubOrganisation}/${repository}:ref:/refs/head/main`,
      },
    }
    

    フォローアップ
    あなたがこのものに興味があるならば、あなたは好きかもしれませんmicroteams !
    私は1つの人AWSのスタートアップからマルチチーム組織に成長しているスケールアップのために書いているガイド.