-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathintrinsic.js
More file actions
298 lines (282 loc) · 12.6 KB
/
intrinsic.js
File metadata and controls
298 lines (282 loc) · 12.6 KB
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
'use strict';
const intrinsic = module.exports = {};
/**
* [The intrinsic function Fn::Base64](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-base64.html)
* returns the Base64 representation of the input string. This function is
* typically used to pass encoded data to Amazon EC2 instances by way of the
* UserData property.
*
* @static
* @memberof cloudfriend
* @name base64
* @param {string} value - The string value you want to convert to Base64.
* @returns The original string, in Base64 representation.
*/
intrinsic.base64 = (value) => {
return { 'Fn::Base64': value };
};
/**
* [The intrinsic function Fn::Cidr](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-cidr.html)
* returns an array of CIDR address blocks. The number of CIDR blocks returned
* is dependent on the count parameter.
*
* @static
* @memberof cloudfriend
* @name cidr
* @param {string} ipBlock - The user-specified CIDR address block to be split into smaller CIDR blocks.
* @param {number} count - The number of CIDRs to generate. Valid range is between 1 and 256.
* @param {number} cidrBits - The number of subnet bits for the CIDR. For example, specifying a value "8" for this parameter will create a CIDR with a mask of "/24".
*/
intrinsic.cidr = (ipBlock, count, cidrBits) => {
return { 'Fn::Cidr': [ipBlock, count, cidrBits] };
};
/**
* [The intrinsic function Fn::FindInMap](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-findinmap.html)
* returns the value corresponding to keys in a two-level map that is declared
* in the Mappings section.
*
* @static
* @memberof cloudfriend
* @name findInMap
* @param {string} mapping - The logical name of a mapping declared in the
* Mappings section that contains the keys and values.
* @param {string} key - The top-level key name. Its value is a list of
* key-value pairs.
* @param {string} attr - The second-level key name, which is set to one of the
* keys from the list assigned to key.
* @param {string} defaultValue - The value that will resolve to if the key and/or attr can not be found from the mapping map.
* This field is optional and requires AWS::LanguageExtensions to be defined in the template.
* @returns The value that is assigned to SecondLevelKey.
*/
intrinsic.findInMap = (mapping, key, attr, defaultValue) => {
const lookup = [mapping, key, attr];
if (defaultValue) {
lookup.push({ DefaultValue: defaultValue });
}
return { 'Fn::FindInMap': lookup };
};
/**
* [The intrinsic function Fn::ForEach](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-foreach.html)
* takes a collection and a fragment, and applies the items in the collection to the identifier in the provided fragment.
*
* @static
* @memberof cloudfriend
* @name forEach
* @param {string} uniqueLoopName - The unique name of the resource loop, must be unique across all loops and resources in the template.
* @param {string} identifier - The identifier to replace with each item in the collection.
* @param {array} collection - The collection of items to iterate over.
* @param {string} outputKeyPrefix - A string to prepend to the identifier of each item in the collection as it is inserted into the outputValue.
* @param {object} outputValue - The resource fragment to insert each item in the collection into.
* @returns {object} The outputValue with the identifier replaced with each item in the collection.
*/
intrinsic.forEach = (uniqueLoopName, identifier, collection, outputKeyPrefix, outputValue) => {
return {
['Fn::ForEach::' + uniqueLoopName]: [
identifier,
collection,
`${outputKeyPrefix}` + '${' + identifier + '}',
outputValue
]
};
};
/**
* [The intrinsic function Fn::GetAtt](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html)
* returns the value of an attribute from a resource in the template.
*
* @static
* @memberof cloudfriend
* @name getAtt
* @param {string} obj - The logical name of the resource that contains the
* attribute you want.
* @param {string} key - The name of the resource-specific attribute whose value
* you want. See the resource's reference page for details about the attributes
* available for that resource type.
* @returns The attribute value.
*/
intrinsic.getAtt = (obj, key) => {
return { 'Fn::GetAtt': [obj, key] };
};
/**
* [The intrinsic function Fn::GetAZs](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getavailabilityzones.html)
* returns an array that lists Availability Zones for a specified region.
* Because customers have access to different Availability Zones, the intrinsic
* function Fn::GetAZs enables template authors to write templates that adapt to
* the calling user's access. That way you don't have to hard-code a full list
* of Availability Zones for a specified region.
*
* @static
* @memberof cloudfriend
* @name getAzs
* @param {string} [region] -The name of the region for which you want to get the
* Availability Zones. You can use the region() function to specify the region
* in which the stack is created. Specifying an empty string is equivalent to
* specifying region().
* @returns The list of Availability Zones for the region.
*/
intrinsic.getAzs = (region) => {
return { 'Fn::GetAZs': region || '' };
};
/**
* [The intrinsic function Fn::Join](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html)
* appends a set of values into a single value, separated by the specified
* delimiter. If a delimiter is the empty string, the set of values are
* concatenated with no delimiter.
*
* @static
* @memberof cloudfriend
* @name join
* @param {string} [delimiter=''] The value you want to occur between fragments.
* @param {array} pieces - The list of values you want combined.
* The delimiter will occur between fragments only. It will not terminate the
* final value.
* @returns The combined string.
*/
intrinsic.join = (delimiter, pieces) => {
if (Array.isArray(delimiter)) {
pieces = delimiter;
delimiter = '';
}
return { 'Fn::Join': [delimiter, pieces] };
};
/**
* [The intrinsic function Fn::Select](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-select.html)
* returns a single object from a list of objects by index.
*
* @static
* @memberof cloudfriend
* @name select
* @param {number} index - The index of the object to retrieve. This must be a
* value from zero to N-1, where N represents the number of elements in the
* array.
* @param {array} list - The list of objects to select from. This list must not
* be null, nor can it have null entries.
* @returns The selected object.
*/
intrinsic.select = (index, list) => {
return { 'Fn::Select': [index.toString(), list] };
};
/**
* [The intrinsic function Ref](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)
* returns the value of the specified parameter or resource.
*
* @static
* @memberof cloudfriend
* @name ref
* @param {string} name - The logical name of the resource or parameter you want
* to dereference.
* @returns The physical ID of the resource or the value of the parameter.
*/
intrinsic.ref = (name) => {
return { Ref: name };
};
/**
* Blends [the intrinsic function Fn::Base64](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-base64.html)
* with [the intrinsic function Fn::Join](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html)
* to produce a Base64 encoding of an array of commands suitable for use in an
* [EC2 LaunchConfiguration's UserData property](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-userdata).
*
* @static
* @memberof cloudfriend
* @name userData
* @param {array} lines - an array of commands
* @returns the array of commands, joined by `\n` and Base 64 encoded
*/
intrinsic.userData = (lines) => {
return intrinsic.base64(intrinsic.join('\n', lines));
};
/**
* [The intrinsic function Sub](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html)
* substitutes variables in an input string with values that you specify. In
* your templates, you can use this function to construct commands or outputs
* that include values that aren't available until you create or update a stack.
*
* @static
* @memberof cloudfriend
* @name sub
* @param {string} str - A string with variables that AWS CloudFormation
* substitutes with their associated values at runtime. Write variables as
* ${MyVarName}. Variables can be template parameter names, resource logical
* IDs, resource attributes, or a variable in a key-value map. If you specify
* only template parameter names, resource logical IDs, and resource attributes,
* don't specify a key-value map.
* If you specify template parameter names or resource logical IDs, such as
* ${InstanceTypeParameter}, AWS CloudFormation returns the same values as if
* you used the Ref intrinsic function. If you specify resource attributes,
* such as ${MyInstance.PublicIp}, AWS CloudFormation returns the same values
* as if you used the Fn::GetAtt intrinsic function.
* To write a dollar sign and curly braces (${}) literally, add an exclamation
* point (!) after the open curly brace, such as ${!Literal}. AWS CloudFormation
* resolves this text as ${Literal}.
* @param {object} [variables] - An object where each key is the name of a
* variable that you included in the String parameter, and each value is the
* value that AWS CloudFormation substitutes for the associated variable name
* at runtime.
* @returns
*/
intrinsic.sub = (str, variables) => {
if (!variables) return { 'Fn::Sub': str };
else return { 'Fn::Sub': [str, variables] };
};
/**
* [The intrinsic function ImportValue](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html)
* returns the value of an output exported by another stack. You typically use
* this function to create cross-stack references.
*
* @static
* @memberof cloudfriend
* @name importValue
* @param {str|object} sharedValue - The stack output value that you want to import.
* @returns the value of an output exported by another stack.
*/
intrinsic.importValue = (sharedValue) => {
return { 'Fn::ImportValue': sharedValue };
};
/**
* [The intrinsic function Fn::Split](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-split.html)
* returns the value of an attribute from a resource in the template.
*
* @static
* @memberof cloudfriend
* @name split
* @param {string} delimiter - The delimiter you would like to split the string on
* @param {object} object - The item you would like to split -- can be a string or an object
* @returns The attribute value.
*/
intrinsic.split = (delimiter, object) => {
return { 'Fn::Split': [delimiter, object] };
};
/**
* Uses [the intrinsic function Fn::Sub](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html)
* to produce an ARN for a particular resource or set of resources.
*
* @static
* @memberof cloudfriend
* @name arn
* @param {string|object} service - the name of the AWS service, e.g. `s3` or `cloudformation`
* @param {string|object} suffix - the last, service-specific part of the arn
* @returns a Fn::Sub object defining the ARN
*/
intrinsic.arn = (service, suffix) => {
const replacement = { service, suffix };
if (service === 's3') return intrinsic.sub('arn:${AWS::Partition}:${service}:::${suffix}', replacement);
else return intrinsic.sub('arn:${AWS::Partition}:${service}:${AWS::Region}:${AWS::AccountId}:${suffix}', replacement);
};
/**
* [The intrinsic function Fn::Transform](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-transform.html)
* returns the processed template snippet to be included in the processed stack template.
*
* @static
* @memberof cloudfriend
* @name transform
* @param {string} name - the name of the CloudFormation macro, e.g. `AWS::Include`
* @param {object} parameters - an object where each key is the name of a
* parameter that should be passed to the macro function, and each value is the
* value of that parameter
* @returns the processed template snippet to be included in the processed stack template.
*/
intrinsic.transform = (name, parameters) => {
return { 'Fn::Transform': {
Name: name,
Parameters: parameters
} };
};