💭

AWS CloudFormation - OIDCProviderのRole設定

2022/10/25に公開

CloudFormationでCodeCommitリポジトリ作成からOIDCProviderのRole設定までを行う。

概要

ここを参考に

https://github.com/aws-actions/configure-aws-credentials

手動でポチポチだと何気に手間なのと、別環境に作って貰う必要がありそうだったので
CloudFormationで行えるように。

  • CodeCommitにGitHubから受信する為のブランチを作成
  • IAMにロールを作成
  • IAMにOIDCプロバイダを作成
  • 作成したロールにポリシーを作成
  • 結果出力にロールとリポジトリのARN、リポジトリのクローンURLを出力

パラメータ

  • CreateRoleName : 作成するロールの名前を設定
  • GitHubClientId : GitHubのクライアントIDを設定
  • GitHubOrg : GitHubのオーナーを設定
  • GitHubRepositoryName : GitHubのリポジトリを設定
  • OIDCThumbprintID : IDプロバイダのサムプリントを設定
  • OIDCProviderArn : IDプロバイダのARNを設定

GitHubClientId、OIDCThumbprintIDは当分変更される事は無いだろうけど、渡せるように。

テンプレート

AWSTemplateFormatVersion: 2010-09-09
Description: CreateGitHubCodeCommitAccessTestRole

Parameters:
  CreateRoleName:
    Description: Name of the role to create.
    Default: "CreateGitHubCodeCommitAccessTestRole"
    Type: String
  GithubClientId:
    Description: GitHub client ID.
    Default: sts.amazonaws.com
    Type: String
  GitHubOrg:
    Description: GitHub Owner.
    Type: String
  GitHubRepositoryName:
    Description: GitHub Repository Name.
    Type: String
  OIDCThumbprintID:
    Description: Thumbprint ID for the GitHub OIDC Provider.
    Default: "6938fd4d98bab03faadb97b34396831e3780aea1"
    Type: String
  OIDCProviderArn:
    Description: Arn for the GitHub OIDC Provider.
    Default: ""
    Type: String

# 条件
#   OIDCProviderArn が 空白の場合に OIDCProvider リソース作成(CreateOIDCProvider)を行う。
#
Conditions:
  CreateOIDCProvider: !Equals
    - !Ref OIDCProviderArn
    - ""

# リソース
#   Repository 作成
#   Role 作成
#   Policy 作成
#   OIDCProvider 作成
#
Resources:
  Repository:
    Type: AWS::CodeCommit::Repository
    Properties:
      RepositoryName: !Sub ${GitHubRepositoryName}
      RepositoryDescription: GitHub CodeCommit Test Repository
      Tags:
        - Key: Created
          Value: CloudFormation
        - Key: Name
          Value: !Sub ${GitHubRepositoryName}
        - Key: Outline
          Value: For push testing from GitHub

  Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: GitHubCodeCommitAccessTestRole
      Description: GitHub CodeCommit Access Test Role
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Action: sts:AssumeRoleWithWebIdentity
            Principal:
              Federated: !If
                - CreateOIDCProvider
                - !Ref GithubOidc
                - !Ref OIDCProviderArn
            Condition:
              StringEquals:
                token.actions.githubusercontent.com:aud:
                  !Sub ${GithubClientId}
              StringLike:
                token.actions.githubusercontent.com:sub:
                  !Sub 'repo:${GitHubOrg}/${GitHubRepositoryName}:ref:refs/heads/main'
      Tags:
        - Key: "Created"
          Value: "CloudFormation"
        - Key: "Name"
          Value: GitHubCodeCommitAccessTestRole
        - Key: "Outline"
          Value: "GitHub Access CodeCommit Role"

  Policy:
    Type: 'AWS::IAM::Policy'
    Properties:
      PolicyName: GitHubCodeCommitAccessTestPolicy
      Roles:
       - !Ref Role
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - codecommit:GitPush
            Resource:
              - !GetAtt Repository.Arn


# OIDCProvider の作成
#   サムプリントIDについては下記のユーザーガイドを参照
#   https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html
#
  GithubOidc:
    Type: AWS::IAM::OIDCProvider
    Condition: CreateOIDCProvider
    Properties:
      Url: 'https://token.actions.githubusercontent.com'
      ClientIdList:
        - !Sub ${GithubClientId}
      ThumbprintList:
        - !Sub ${OIDCThumbprintID}
      Tags:
        - Key: "Created"
          Value: "CloudFormation"
        - Key: "Name"
          Value: GitHubOIDCProvider
        - Key: "Outline"
          Value: "GitHub Access OIDC Provider"

Outputs:
  RoleArn:
    Value: !GetAtt Role.Arn
  RepositoryArn:
    Value: !GetAtt Repository.Arn
  RepositoryCloneUrlHttp:
    Value: !GetAtt Repository.CloneUrlHttp

Discussion