lambda-macro-pipeline-multistagecd Needs no specific permissions, you may want to add following policies to it’s role:
arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole (if you want to see CloudWatch logs of resource handler execution);arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess (if you want more detailed tracing, package is built with X-Ray instrumentor).Section: Pipeline.
This macro operates on dedicated template section, Pipeline. It has sub-sections to set different aspects of CI/CD pipeline.
configConfiguration section is optional, and allows to customize managed pipeline. If omitted, default configuration is applied.
resourceName - string (default: Pipeline)Managed pipeline resource name.
hasCheckoutStepParameterName - string (default: HasCheckoutStep)Name of parameter that controls existence of initial checkout steps.
hasNextStageParameterName - string (default: HasNextStage)Name of parameter that controls existence of stage promotion steps.
requiresManualApprovalParameterName - string (default: RequiresManualApproval)Name of parameter that controls existence of manual approval step.
hasCheckoutStepConditionName - string (default: HasCheckoutStep)Name of condition that controls existence of initial checkout steps (it reflects parameter value).
hasNextStageConditionName - string (default: HasNextStage)Name of parameter that controls existence of stage promotion steps (it reflects parameter value).
requiresManualApprovalConditionName - string (default: RequiresManualApproval)Name of parameter that controls existence of manual approval step (it reflects parameter value and considers also next stage condition).
webhookAuthenticationType - string | objectAuthentication type for Git webhook. If not specified, webhook will not be created.
webhookSecretToken - string | objectWebhook secret token. If not specified, webhook will not be created. This setting can be a string, but also complex construct (like intrinsic function call)
propertiesAny properties that will be passed directly to AWS::CodePipeline::Pipeline resource.
sourcesDefinition initial sources. These sources are used as inputs for the initial stage (based on HasCheckoutStage parameter). For any further stage previous stage artifacts are used - for that see artifacts section below.
Each source is an entry with key being used as action name and implicitly output artifact name. Entry content is definition of CodePipeline action:
sources:
checkout:
ActionTypeId:
Category: "Source"
Owner: "ThirdParty"
Provider: "GitHub"
Version: "1"
Configuration:
Owner: "yourorganization"
Repo: "reponame"
Branch:
Ref: "branch"
OAuthToken: "{{resolve:secretsmanager:GitHub:SecretString:OAuthToken}}"
PollForSourceChanges: false
stagesContent of the pipeline. It is mapped into final AWS::CodePipeline::Pipeline stages property elements. However there are some simplifications:
RunOrder property (it will be calculated based on artifacts dependencies);InputArtifacts and OutputArtifacts are list of simple strings (not objects with Name property);ActionTypeId properties Owner and Version are not required (defaults to AWS and 1 respectively);CloudFormation deploy steps no ActionTypeId is required at all, this is the default action;Condition property of stage;CloudFormation deploy action input artifacts are detected automatically for TemplatePath and TemplateConfiguration properties if they are plain strings (it’s still possible to define additional artifacts explicitly).artifactsPipeline artifacts are artifacts of pipeline actions that you want to promote to next deployment stage. The same list will be used to build sources list of non-initial stage, binding deployment stages to chain after promotion (successful execution of previous stage). Right now only S3 is supported as artifacts transition (deploy action is used to push artifacts into next stage and source is defined in next stage pipeline).
Transform:
- "WrzasqPlMultistagePipeline"
Parameters:
HasCheckoutStep:
Type: String
Default: 'false'
AllowedValues:
- 'true'
- 'false'
HasNextStage:
Type: String
Default: 'false'
AllowedValues:
- 'true'
- 'false'
RequiresManualApproval:
Type: String
Default: 'true'
AllowedValues:
- 'true'
- 'false'
Resources:
BuildProject:
Type: "AWS::CodeBuild::Project"
Pipeline:
config:
resourceName: "DeployPipeline"
properties:
RestartExecutionOnUpdate: true
RoleArn: "arn:aws:iam::765719665682:role/service-role/test"
ArtifactStore:
Type: "S3"
Location: "test-local-lambda"
sources:
checkout:
ActionTypeId:
Category: "Source"
Owner: "AWS"
Provider: "S3"
Version: "1"
Configuration:
S3Bucket: "test-local-lambda"
S3ObjectKey: "pl.wrzasq.lambda/checkout.zip"
stages:
-
# this is example of conditional stage
Name: "Build"
Condition: "HasCheckoutStep"
Actions:
-
Name: "Build"
ActionTypeId:
Category: "Build"
Provider: "CodeBuild"
Configuration:
ProjectName: !Ref "BuildProject"
EnvironmentVariables: |
[
{
"name": "VERSION_STRING",
"value": "#{codepipeline.PipelineExecutionId}"
}
]
InputArtifacts:
- "checkout"
OutputArtifacts:
- "build"
-
Name: "Deploy"
Actions:
-
Name: "Database"
Configuration:
ActionMode: "CREATE_UPDATE"
StackName: !Sub "${ServiceName}-db"
RoleArn: !ImportValue "infra:DeployRole:Arn"
Capabilities: "CAPABILITY_NAMED_IAM"
# `build` artifact will automatically be detected
TemplatePath: "build::cloudformation/db.yaml"
# since this is not a plain string value `templates` artifact needs to be added manually
TemplateConfiguration: !Sub "templates::cloudformation/config-${EnvironmentName}.json"
OutputFileName: "out.json"
InputArtifacts:
- "templates"
OutputArtifacts:
- "database"
-
Name: "EventsListenerLambda"
Configuration:
ActionMode: "CREATE_UPDATE"
StackName: "events-recorder"
Capabilities: "CAPABILITY_NAMED_IAM,CAPABILITY_AUTO_EXPAND"
TemplatePath: "templates::cloudformation/events-listener.yaml"
TemplateConfiguration: "templates::cloudformation/config-dev.json"
OutputFileName: "out.json"
ParameterOverrides: |
{
"EventsTableName": { "Fn::GetParam": ["database", "out.json", "EventsTableName"] },
"EventsTableArn": { "Fn::GetParam": ["database", "out.json", "EventsTableArn"] }
}
InputArtifacts:
- "database"
OutputArtifacts:
- "events-listener"
-
Name: "AuthorizerLambda"
Configuration:
ActionMode: "CREATE_UPDATE"
StackName: "authorizer"
Capabilities: "CAPABILITY_NAMED_IAM,CAPABILITY_AUTO_EXPAND"
TemplatePath: "templates::cloudformation/authorizer.yaml"
OutputFileName: "out.json"
OutputArtifacts:
- "authorizer"
-
Name: "API"
Configuration:
ActionMode: "CREATE_UPDATE"
StackName: "api"
Capabilities: "CAPABILITY_NAMED_IAM,CAPABILITY_AUTO_EXPAND"
TemplatePath: "templates::cloudformation/api.yaml"
OutputFileName: "out.json"
ParameterOverrides: |
{
"AuthorizerLambda": { "Fn::GetParam": ["authorizer", "out.json", "LambdaArn"] },
"EventsListenerLambda": { "Fn::GetParam": ["events-listener", "out.json", "LambdaArn"] }
}
InputArtifacts:
- "authorizer"
- "events-listener"
artifacts:
build:
sourceBucketName: !ImportValue "wrzasq:ArtifactsBucket:Name"
nextBucketName: !Ref "NextStageBucketName"
objectKey: "pl.wrzasq.lambda/build.zip"
templates:
sourceBucketName: !ImportValue "wrzasq:ArtifactsBucket:Name"
nextBucketName: !Ref "NextStageBucketName"
objectKey: "pl.wrzasq.lambda/templates.zip"
MacroFunctionRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Statement:
-
Action: "sts:AssumeRole"
Effect: "Allow"
Principal:
Service:
- "lambda.amazonaws.com"
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
MacroFunction:
Type: "AWS::Serverless::Function"
Properties:
Runtime: "java11"
Code:
# put your source bucket
S3Bucket: "your-bucket"
S3Key: "lambda-macro-pipeline-multistagecd-1.1.2-standalone.jar"
Handler: "pl.wrzasq.lambda.macro.pipeline.multistagecd.Handler::handleRequest"
MemorySize: 256
Description: "Custom CloudFormation macro handler."
Timeout: 300
TracingConfig:
Mode: "Active"
Role: !GetAtt "MacroFunctionRole.Arn"
Macro:
Type: "AWS::CloudFormation::Macro"
Properties:
Name: "WrzasqPlMultistagePipeline"
FunctionName: !GetAtt "MacroFunction.Arn"