-
Notifications
You must be signed in to change notification settings - Fork 0
/
attini-sam.ts
128 lines (105 loc) · 4.07 KB
/
attini-sam.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { FieldUtils } from 'aws-cdk-lib/aws-stepfunctions';
import { Construct } from 'constructs';
import { AttiniTask } from './attini-task';
import { CfnAction, PropsUtil } from './index';
export interface Project {
/**
* The path to the SAM App in the Attini project.
*
* The Path should always start from the root of the Attini project.
*/
readonly path: string;
/**
* The path and file name of AWS SAM template file.
*
* Only needed if Attini did not perform the SAM build and a custom template name was specified with the --template option.
* For more information, see the {@link https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html AWS SAM CLI build documentation}.
*/
readonly template?: string;
/**
* The path to a directory where the built artifacts are stored.
*
* Only needed if Attini did not perform the SAM build and a custom build dir was specified with the --build-dir option.
* For more information, see the {@link https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html AWS SAM CLI build documentation}.
*/
readonly buildDir?: string;
}
export interface AttiniSamProps {
/**
* SAM project config
*/
readonly project: Project;
/**
* The name that should be given to the stack when deployed. The name must be unique in the Region in which you are creating the stack.
*/
readonly stackName: string;
/**
* Specifies a path to a configuration file for the stack.
*
* For more information, see the {@link https://docs.attini.io/api-reference/cloudformation-configuration.html#api-reference-cloudformation-configuration documentation}
*/
readonly configFile?: string;
/**
* The parameters for the stack.
*
* For more information, see the {@link https://docs.attini.io/api-reference/cloudformation-configuration.html#api-reference-cloudformation-configuration documentation}
*/
readonly parameters?: { [key: string]: string };
/**
* The tags for the stack
*/
readonly tags?: { [key: string]: string };
/**
* The arn of the StackRole, find more info here: {@link https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-servicerole.html AWS CloudFormation service role}
*/
readonly stackRoleArn?: string;
/**
* The role that should be assumed when the Attini Framework deploys the CloudFormation stack.
*
* The ExecutionRole has to trust the following role so that it can be assumed:
* ```
arn:aws:iam::{AccountId}:role/attini/attini-action-role-{Region}
* ```
*/
readonly executionRoleArn?: string;
/**
* Variables that should be passed to any {@link configFile} that is configured.
* Variables can be referenced in the configuration file and can be used to pass data from the payload to the configuration.
*/
readonly variables?: { [key: string]: string };
/**
* Specify if the stack should be created/updated or deleted.
*
*/
readonly action?: CfnAction;
/**
* Specify if termination protection should be enabled for the stack.
*
* For more information, see the {@link https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html AWS documentation}.
*
*/
readonly enableTerminationProtection?: boolean;
}
/**
* A step for deploying an AWS SAM Project
*/
export class AttiniSam extends AttiniTask {
type: string = 'AttiniSam';
constructor(scope: Construct, id: string, private props: AttiniSamProps) {
super(scope, id);
}
protected renderProps(): object {
let copy: any = { ...this.props };
if (this.props.action && this.props.action.valueOf() === CfnAction.DEPLOY.valueOf()) {
copy.action = 'Deploy';
} else if (this.props.action && this.props.action.valueOf() === CfnAction.DELETE.valueOf()) {
copy.action = 'Delete';
}
return {
Properties: {
...FieldUtils.renderObject(PropsUtil.fixCase(copy)),
Project: FieldUtils.renderObject(PropsUtil.fixCase(this.props.project)),
},
};
}
}