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