CodePipelineをCloudFormationで作成する方法まとめ

CodePipeline

CodePipeline を CloudFormation で作成する方法をまとめました。
この記事では GitHub のソースコードを S3 に配置する CodePipeline を作成します。

スポンサーリンク

手動で作成する方法

AWS コンソールから手動で作成する場合は以下のようになります。

  • CodePipeline > パイプライン > パイプラインを作成する をクリックします。
    • パイプラインの設定
      • パイプライン名
        • 任意のパイプライン名を入力します。
      • サービスロール
        • 既存のサービスロール
      • ロールの ARN
        • CodePipeline を実行する IAM Role の ARN を指定します。
      • アーティファクトストア
        • アーティファクトを置く S3 バケットを指定します。
    • ソースステージ
      • ソースプロバイダー
        • GitHub (バージョン1)
      • GitHub に接続する
        • Authorize aws-codesuite をクリックします。
      • リポジトリ
        • 連携したいリポジトリを指定します。
      • ブランチ
        • 連携したいブランチを指定します。
      • 検出オプションを変更する
        • GitHub ウェブフック
    • ビルドステージ
      • ビルドステージをスキップします。
    • デプロイステージ
      • デプロイプロバイダー
        • Amazon S3
      • リージョン
        • 任意のリージョンを指定します。
      • バケット
        • 配置先の S3 バケットを指定します。
      • デプロイする前にファイルを抽出する
        • チェックします。

CloudFormation で作成する方法

IAM Role

CodePipeline 用の IAM Role を作成します。
Outputs で CodePipeline の IAM Role の ARN を出力します。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  System:
    Type: String
    Default: sample
    Description: System name.
  Environment:
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - qa
      - prod
    Description: Environment name. Choose from [dev, qa, prod].

Resources:
  CodePipelineRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "${Environment}-${System}-iam-role-CodePipelineRole"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - codepipeline.amazonaws.com
                - cloudformation.amazonaws.com
            Action:
              - sts:AssumeRole
      Description: "IAM Role for CodePipeline."
      Policies:
        # CodePipeline 用インラインポリシー
        - PolicyName: role-policy-codepipeline
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
            -
              Action:
              - "iam:PassRole"
              Resource: "*"
              Effect: "Allow"
              Condition:
                StringEqualsIfExists:
                  iam:PassedToService:
                  - "cloudformation.amazonaws.com"
                  - "elasticbeanstalk.amazonaws.com"
                  - "ec2.amazonaws.com"
                  - "ecs-tasks.amazonaws.com"
            -
              Action:
              - "codecommit:CancelUploadArchive"
              - "codecommit:GetBranch"
              - "codecommit:GetCommit"
              - "codecommit:GetUploadArchiveStatus"
              - "codecommit:UploadArchive"
              Resource: "*"
              Effect: "Allow"
            -
              Action:
              - "codedeploy:CreateDeployment"
              - "codedeploy:GetApplication"
              - "codedeploy:GetApplicationRevision"
              - "codedeploy:GetDeployment"
              - "codedeploy:GetDeploymentConfig"
              - "codedeploy:RegisterApplicationRevision"
              Resource: "*"
              Effect: "Allow"
            -
              Action:
              - "codestar-connections:UseConnection"
              Resource: "*"
              Effect: "Allow"
            -
              Action:
              - "elasticbeanstalk:*"
              - "ec2:*"
              - "elasticloadbalancing:*"
              - "autoscaling:*"
              - "cloudwatch:*"
              - "s3:*"
              - "sns:*"
              - "cloudformation:*"
              - "rds:*"
              - "sqs:*"
              - "ecs:*"
              Resource: "*"
              Effect: "Allow"
            -
              Action:
              - "lambda:InvokeFunction"
              - "lambda:ListFunctions"
              Resource: "*"
              Effect: "Allow"
            -
              Action:
              - "opsworks:CreateDeployment"
              - "opsworks:DescribeApps"
              - "opsworks:DescribeCommands"
              - "opsworks:DescribeDeployments"
              - "opsworks:DescribeInstances"
              - "opsworks:DescribeStacks"
              - "opsworks:UpdateApp"
              - "opsworks:UpdateStack"
              Resource: "*"
              Effect: "Allow"
            -
              Action:
              - "cloudformation:CreateStack"
              - "cloudformation:DeleteStack"
              - "cloudformation:DescribeStacks"
              - "cloudformation:UpdateStack"
              - "cloudformation:CreateChangeSet"
              - "cloudformation:DeleteChangeSet"
              - "cloudformation:DescribeChangeSet"
              - "cloudformation:ExecuteChangeSet"
              - "cloudformation:SetStackPolicy"
              - "cloudformation:ValidateTemplate"
              Resource: "*"
              Effect: "Allow"
            -
              Action:
              - "codebuild:BatchGetBuilds"
              - "codebuild:StartBuild"
              - "codebuild:BatchGetBuildBatches"
              - "codebuild:StartBuildBatch"
              Resource: "*"
              Effect: "Allow"
            - Effect: "Allow"
              Action:
              - "devicefarm:ListProjects"
              - "devicefarm:ListDevicePools"
              - "devicefarm:GetRun"
              - "devicefarm:GetUpload"
              - "devicefarm:CreateUpload"
              - "devicefarm:ScheduleRun"
              Resource: "*"
            - Effect: "Allow"
              Action:
              - "servicecatalog:ListProvisioningArtifacts"
              - "servicecatalog:CreateProvisioningArtifact"
              - "servicecatalog:DescribeProvisioningArtifact"
              - "servicecatalog:DeleteProvisioningArtifact"
              - "servicecatalog:UpdateProduct"
              Resource: "*"
            - Effect: "Allow"
              Action:
              - "cloudformation:ValidateTemplate"
              Resource: "*"
            - Effect: "Allow"
              Action:
              - "ecr:DescribeImages"
              Resource: "*"
            - Effect: "Allow"
              Action:
              - "states:DescribeExecution"
              - "states:DescribeStateMachine"
              - "states:StartExecution"
              Resource: "*"
            - Effect: "Allow"
              Action:
              - "appconfig:StartDeployment"
              - "appconfig:StopDeployment"
              - "appconfig:GetDeployment"
              Resource: "*"

Outputs:
  CodePipelineRoleArn:
    Value: !GetAtt CodePipelineRole.Arn
    Export: 
      Name: !Sub "${Environment}-${System}-iam-role-CodePipelineRole-arn"

CodePipeline

CodePipeline を作成します。
GitHub のアクセストークンは Secrets Manager で秘匿します。
CloudFormation ではシークレット名とキーを指定して Secrets Manager からアクセストークンを取得できます。
CodePipeline の IAM Role を ImportValue で参照します。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  System:
    Type: String
    Default: sample
    Description: System name.
  Environment:
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - qa
      - prod
  GitHubRepositoryName:
    Type: String
    Default: your_repository
    Description: GitHub repository name.
  GitHubBranchName:
    Type: String
    Default: main
    Description: GitHub branch name.
  GitHubRepositoryOwner:
    Type: String
    Default: your_repository_owner
    Description: GitHub repository owner.

Resources:
  CodePipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      RoleArn:
        Fn::ImportValue: !Sub "${Environment}-${System}-iam-role-CodePipelineRole-arn"
      Name: "${Environment}-${System}-github-to-s3"
      ArtifactStore:
        Type: S3
        Location:
          # アーティファクトの格納先 S3 バケットを指定します。
          !Sub "${Environment}-${System}-artifact-store"
      Stages:
        - Name: Source
          Actions:
            - Name: SourceAction
              ActionTypeId:
                Category: Source
                Owner: ThirdParty
                Version: 1
                Provider: GitHub
              Configuration:
                Owner: !Ref GitHubRepositoryOwner
                Repo: !Ref GitHubRepositoryName
                PollForSourceChanges: false
                Branch: !Ref GitHubBranchName
                # Secrets Manager から取得します。
                OAuthToken: "{{resolve:secretsmanager:your_secret_name:SecretString:your_secret_key}}"
              RunOrder: 1
              OutputArtifacts:
                - Name: SourceArtifact
        - Name: Deploy
          Actions:
            - Name: Deploy
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Version: 1
                Provider: S3
              Configuration:
                BucketName:
                  # デプロイ先の S3 バケットを指定します。
                  !Sub "${Environment}-${System}-deploy-destination"
                   # 特定の Object Key を指定したい場合は以下のコメントアウトを外します。
                   # ObjectKey: your-s3-object-key
                Extract: true
              RunOrder: 1
              InputArtifacts:
                - Name: SourceArtifact
タイトルとURLをコピーしました