GitHubActionsからAWSにRoleでアクセス

Posted on 2022/08/21

ToC

GitHubにクレデンシャルを渡さなくても良い

GitHub Actionsでビルドした成果物をAWS上に配備したいことがあるのではないでしょうか。
その際に少し前までは、永続的なクレデンシャルを渡す必要があったのですが、セキュリティ的にもあまり良いとは言えないと 個人的には思っていました。
1年ぐらい前にはなってしまいますが、2021年秋頃に界隈でも話題になった内容なのですが、これまでGitHub Actionsを 使っていながら、試していなかったので改めて試してみました。

メカニズムについては、GitHubのブログに記載されています。

OpenID Connect Providerの設定

まず、連携するAWSアカウントにて、GitHub Actionsで利用する認証連携のためのOpenID Connect Providerを作成します。 こちらは、AWSアカウントに対して1回だけ作成すれば良いようです。
ちなみにThumbprintを取得する際には、マネジメントコンソールから取得できます。 IAM > Identity providers > Add providerOpenID Connectを選択して、URLを入力すると取得できます。

Resources:
  GithubOidc:
    Type: AWS::IAM::OIDCProvider
    Properties:
      Url: https://token.actions.githubusercontent.com
      ClientIdList:
        - sts.amazonaws.com
      ThumbprintList:
        - !Ref "Thumbprint"

IAM Roleの設定

次にGitHub Actionsに利用を許可するIAM Roleを設定します。
ポイントは、Principalとして、さきほど作成したOIDCProviderを指定した上で、 さらにCondition設定にて呼び出し元となるGitHub Actionsのレポジトリを指定して呼び出し元を限定しているところですね。
目的や用途によるとは思いますが、Principle of Least Privilege (最小権限の原則)の設計思想にしたがって、 必要な権限だけを付与することをおすすめします。

Resources:
  GithubCDRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "github-cd-role"
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Action: sts:AssumeRoleWithWebIdentity
            Principal:
              Federated: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com"
            Condition:
              StringLike:
                token.actions.githubusercontent.com:sub: !Sub repo:${GitHubOrganization}/${RepositoryName}:*
      Policies:
        - PolicyName: !Sub 'CloudFormation'
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Sid: !Sub 'Validate01'
                Effect: Allow
                Action:
                  - "cloudformation:ValidateTemplate"
                Resource:
                  - "*"

GitHub Actionsの設定

AWSを利用する際のGitHub ActionsJobの例を下記に示します。 まず、事前に設定したIAM RoleのArn情報をGitHubのActions secretsに設定します。 下記の例では、AWS_CD_ROLE_TO_ASSUMEとしています。

上記を設定した上で、AWSが公開しているGitHub ActionsであるConfigure AWS Credentialsを活用します。 Readmeが充実しているので、その内容を確認しながら進めればあまり悩むことはないかと思います。

jobs:
  cloudformation-validate:
    runs-on: ubuntu-latest
    env:
      TEMPLATE_PATH: "cfn"
      TEMPLATE_FILE: "*.yaml"
      AWS_REGION: "us-west-2"
    permissions:
      id-token: write
      contents: read

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: "${{ secrets.AWS_CD_ROLE_TO_ASSUME }}"
          aws-region: "${{ env.AWS_REGION }}"
          role-duration-seconds: 900

      - name: Cloud Formation Validate
        if: success()
        run: |      
          # validate template (<= 51,200)
          for file_path in $(find ./${TEMPLATE_PATH} -name ${TEMPLATE_FILE} -size -51200c); do
              aws --region ${AWS_REGION} cloudformation validate-template --template-body file://${file_path}
          done

さらにもう少し踏み込むと、GitHub ActionsでビルドしたDocker ImageをECRに登録することも比較的簡単にできるようになります。 Amazon ECR “Login” Action for GitHub Actionsなどを参考に進めてみるのも良いのではないでしょうか。

この機能は、AWSの機能検証を行う際にGitHubに登録したソースコードを直接活用できるという点で非常に良い機能ですね。


参照