@brunwig/mup-aws-beanstalk 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +6 -0
- package/.eslintignore +2 -0
- package/.eslintrc.yml +10 -0
- package/.github/FUNDING.yml +12 -0
- package/changelog.md +56 -0
- package/docs/getting-started.md +83 -0
- package/docs/index.md +333 -0
- package/index.js +1 -0
- package/lib/assets/env.sh +30 -0
- package/lib/assets/env.yaml +19 -0
- package/lib/assets/graceful_shutdown.sh +14 -0
- package/lib/assets/graceful_shutdown.yaml +7 -0
- package/lib/assets/health-check.js +54 -0
- package/lib/assets/health-check.js.map +1 -0
- package/lib/assets/nginx-server.conf +59 -0
- package/lib/assets/nginx.conf +85 -0
- package/lib/assets/nginx.yaml +13 -0
- package/lib/assets/node.sh +25 -0
- package/lib/assets/node.yaml +8 -0
- package/lib/assets/npmrc +1 -0
- package/lib/assets/package.json +7 -0
- package/lib/assets/packages.yaml +5 -0
- package/lib/assets/start.sh +21 -0
- package/lib/aws.js +98 -0
- package/lib/aws.js.map +1 -0
- package/lib/certificates.js +64 -0
- package/lib/certificates.js.map +1 -0
- package/lib/command-handlers.js +774 -0
- package/lib/command-handlers.js.map +1 -0
- package/lib/commands.js +145 -0
- package/lib/commands.js.map +1 -0
- package/lib/download.js +27 -0
- package/lib/download.js.map +1 -0
- package/lib/eb-config.js +269 -0
- package/lib/eb-config.js.map +1 -0
- package/lib/env-ready.js +121 -0
- package/lib/env-ready.js.map +1 -0
- package/lib/env-settings.js +22 -0
- package/lib/env-settings.js.map +1 -0
- package/lib/index.js +111 -0
- package/lib/index.js.map +1 -0
- package/lib/policies.js +144 -0
- package/lib/policies.js.map +1 -0
- package/lib/prepare-bundle.js +245 -0
- package/lib/prepare-bundle.js.map +1 -0
- package/lib/recheck.js +27 -0
- package/lib/recheck.js.map +1 -0
- package/lib/upload.js +75 -0
- package/lib/upload.js.map +1 -0
- package/lib/utils.js +678 -0
- package/lib/utils.js.map +1 -0
- package/lib/validate.js +67 -0
- package/lib/validate.js.map +1 -0
- package/lib/versions.js +116 -0
- package/lib/versions.js.map +1 -0
- package/package.json +65 -0
- package/readme.md +18 -0
package/lib/env-ready.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getLastEvent = getLastEvent;
|
|
7
|
+
exports.showEvents = showEvents;
|
|
8
|
+
exports.waitForEnvReady = waitForEnvReady;
|
|
9
|
+
exports.waitForHealth = waitForHealth;
|
|
10
|
+
|
|
11
|
+
var _utils = require("./utils");
|
|
12
|
+
|
|
13
|
+
var _aws = require("./aws");
|
|
14
|
+
|
|
15
|
+
var _recheck = require("./recheck");
|
|
16
|
+
|
|
17
|
+
async function getLastEvent(config) {
|
|
18
|
+
const {
|
|
19
|
+
environment
|
|
20
|
+
} = (0, _utils.names)(config);
|
|
21
|
+
const {
|
|
22
|
+
Events
|
|
23
|
+
} = await _aws.beanstalk.describeEvents({
|
|
24
|
+
EnvironmentName: environment,
|
|
25
|
+
MaxRecords: 5
|
|
26
|
+
}).promise();
|
|
27
|
+
return Events[0].EventDate;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function showEvents(config, lastEventDate) {
|
|
31
|
+
const {
|
|
32
|
+
environment,
|
|
33
|
+
app
|
|
34
|
+
} = (0, _utils.names)(config);
|
|
35
|
+
const {
|
|
36
|
+
Events
|
|
37
|
+
} = await _aws.beanstalk.describeEvents({
|
|
38
|
+
EnvironmentName: environment,
|
|
39
|
+
ApplicationName: app,
|
|
40
|
+
StartTime: lastEventDate
|
|
41
|
+
}).promise();
|
|
42
|
+
Events.forEach(event => {
|
|
43
|
+
if (event.EventDate.toString() === lastEventDate.toString()) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
console.log(` Env Event: ${event.Message}`);
|
|
48
|
+
});
|
|
49
|
+
return new Date(Events[0].EventDate);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function checker(config, prop, wantedValue, showProgress) {
|
|
53
|
+
const {
|
|
54
|
+
environment,
|
|
55
|
+
app
|
|
56
|
+
} = (0, _utils.names)(config);
|
|
57
|
+
let lastEventDate = null;
|
|
58
|
+
let lastStatus = null;
|
|
59
|
+
|
|
60
|
+
if (showProgress) {
|
|
61
|
+
lastEventDate = await getLastEvent(config);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
async function check() {
|
|
66
|
+
let result;
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
result = await _aws.beanstalk.describeEnvironments({
|
|
70
|
+
EnvironmentNames: [environment],
|
|
71
|
+
ApplicationName: app
|
|
72
|
+
}).promise();
|
|
73
|
+
} catch (e) {
|
|
74
|
+
if ((0, _recheck.checkForThrottlingException)(e)) {
|
|
75
|
+
(0, _recheck.handleThrottlingException)();
|
|
76
|
+
return setTimeout(check, (0, _recheck.getRecheckInterval)());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
console.log(e);
|
|
80
|
+
reject(e);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const value = result.Environments[0][prop];
|
|
84
|
+
|
|
85
|
+
if (value !== wantedValue && value !== lastStatus) {
|
|
86
|
+
const text = prop === 'Health' ? `be ${wantedValue}` : `finish ${value}`;
|
|
87
|
+
(0, _utils.logStep)(`=> Waiting for Beanstalk environment to ${text.toLocaleLowerCase()}`);
|
|
88
|
+
lastStatus = value;
|
|
89
|
+
} else if (value === wantedValue) {
|
|
90
|
+
// TODO: run showEvents one last time
|
|
91
|
+
resolve();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (showProgress) {
|
|
96
|
+
try {
|
|
97
|
+
lastEventDate = await showEvents(config, lastEventDate);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
if ((0, _recheck.checkForThrottlingException)(e)) {
|
|
100
|
+
(0, _recheck.handleThrottlingException)();
|
|
101
|
+
} else {
|
|
102
|
+
console.log(e);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
setTimeout(check, (0, _recheck.getRecheckInterval)());
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
check();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function waitForEnvReady(config, showProgress) {
|
|
115
|
+
await checker(config, 'Status', 'Ready', showProgress);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function waitForHealth(config, health = 'Green', showProgress) {
|
|
119
|
+
await checker(config, 'Health', health, showProgress);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=env-ready.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/env-ready.js"],"names":["getLastEvent","config","environment","Events","beanstalk","describeEvents","EnvironmentName","MaxRecords","promise","EventDate","showEvents","lastEventDate","app","ApplicationName","StartTime","forEach","event","toString","console","log","Message","Date","checker","prop","wantedValue","showProgress","lastStatus","Promise","resolve","reject","check","result","describeEnvironments","EnvironmentNames","e","setTimeout","value","Environments","text","toLocaleLowerCase","waitForEnvReady","waitForHealth","health"],"mappings":"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","sourcesContent":["import {\n logStep,\n names\n} from './utils';\nimport { beanstalk } from './aws';\nimport {\n getRecheckInterval,\n checkForThrottlingException,\n handleThrottlingException\n} from './recheck';\n\nexport async function getLastEvent(config) {\n const {\n environment\n } = names(config);\n\n const {\n Events\n } = await beanstalk.describeEvents({\n EnvironmentName: environment,\n MaxRecords: 5\n }).promise();\n\n return Events[0].EventDate;\n}\n\nexport async function showEvents(config, lastEventDate) {\n const {\n environment,\n app\n } = names(config);\n\n const {\n Events\n } = await beanstalk.describeEvents({\n EnvironmentName: environment,\n ApplicationName: app,\n StartTime: lastEventDate\n }).promise();\n\n Events.forEach((event) => {\n if (event.EventDate.toString() === lastEventDate.toString()) {\n return;\n }\n console.log(` Env Event: ${event.Message}`);\n });\n\n return new Date(Events[0].EventDate);\n}\n\nasync function checker(config, prop, wantedValue, showProgress) {\n const {\n environment,\n app\n } = names(config);\n\n let lastEventDate = null;\n let lastStatus = null;\n\n if (showProgress) {\n lastEventDate = await getLastEvent(config);\n }\n\n return new Promise((resolve, reject) => {\n async function check() {\n let result;\n try {\n result = await beanstalk.describeEnvironments({\n EnvironmentNames: [environment],\n ApplicationName: app\n }).promise();\n } catch (e) {\n if (checkForThrottlingException(e)) {\n handleThrottlingException();\n return setTimeout(check, getRecheckInterval());\n }\n\n console.log(e);\n reject(e);\n }\n const value = result.Environments[0][prop];\n if (value !== wantedValue && value !== lastStatus) {\n const text = prop === 'Health' ? `be ${wantedValue}` : `finish ${value}`;\n\n logStep(`=> Waiting for Beanstalk environment to ${text.toLocaleLowerCase()}`);\n lastStatus = value;\n } else if (value === wantedValue) {\n // TODO: run showEvents one last time\n resolve();\n\n return;\n }\n\n if (showProgress) {\n try {\n lastEventDate = await showEvents(config, lastEventDate);\n } catch (e) {\n if (checkForThrottlingException(e)) {\n handleThrottlingException();\n } else {\n console.log(e);\n }\n }\n }\n\n setTimeout(check, getRecheckInterval());\n }\n\n check();\n });\n}\n\nexport async function waitForEnvReady(config, showProgress) {\n await checker(config, 'Status', 'Ready', showProgress);\n}\n\nexport async function waitForHealth(config, health = 'Green', showProgress) {\n await checker(config, 'Health', health, showProgress);\n}\n"],"file":"env-ready.js"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createEnvFile = createEnvFile;
|
|
7
|
+
|
|
8
|
+
var _shellEscape = _interopRequireDefault(require("shell-escape"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
function createEnvFile(env, settings) {
|
|
13
|
+
let content = '';
|
|
14
|
+
const settingsString = encodeURIComponent(JSON.stringify(settings));
|
|
15
|
+
Object.keys(env).forEach(key => {
|
|
16
|
+
const value = (0, _shellEscape.default)([env[key]]);
|
|
17
|
+
content += `export ${key}=${value}\n`;
|
|
18
|
+
});
|
|
19
|
+
content += `export METEOR_SETTINGS_ENCODED=${(0, _shellEscape.default)([settingsString])}`;
|
|
20
|
+
return content;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=env-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/env-settings.js"],"names":["createEnvFile","env","settings","content","settingsString","encodeURIComponent","JSON","stringify","Object","keys","forEach","key","value"],"mappings":";;;;;;;AAAA;;;;AAEO,SAASA,aAAT,CAAuBC,GAAvB,EAA4BC,QAA5B,EAAsC;AAC3C,MAAIC,OAAO,GAAG,EAAd;AACA,QAAMC,cAAc,GAAGC,kBAAkB,CAACC,IAAI,CAACC,SAAL,CAAeL,QAAf,CAAD,CAAzC;AAEAM,EAAAA,MAAM,CAACC,IAAP,CAAYR,GAAZ,EAAiBS,OAAjB,CAA0BC,GAAD,IAAS;AAChC,UAAMC,KAAK,GAAG,0BAAY,CAACX,GAAG,CAACU,GAAD,CAAJ,CAAZ,CAAd;AACAR,IAAAA,OAAO,IAAK,UAASQ,GAAI,IAAGC,KAAM,IAAlC;AACD,GAHD;AAKAT,EAAAA,OAAO,IAAK,kCAAiC,0BAAY,CAACC,cAAD,CAAZ,CAA8B,EAA3E;AACA,SAAOD,OAAP;AACD","sourcesContent":["import shellEscape from 'shell-escape';\n\nexport function createEnvFile(env, settings) {\n let content = '';\n const settingsString = encodeURIComponent(JSON.stringify(settings));\n\n Object.keys(env).forEach((key) => {\n const value = shellEscape([env[key]]);\n content += `export ${key}=${value}\\n`;\n });\n\n content += `export METEOR_SETTINGS_ENCODED=${shellEscape([settingsString])}`;\n return content\n}\n"],"file":"env-settings.js"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.prepareConfig = prepareConfig;
|
|
7
|
+
exports.hooks = exports.validate = exports.commands = exports.description = exports.name = void 0;
|
|
8
|
+
|
|
9
|
+
var _commands = _interopRequireWildcard(require("./commands"));
|
|
10
|
+
|
|
11
|
+
var _validate = _interopRequireDefault(require("./validate"));
|
|
12
|
+
|
|
13
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
+
|
|
15
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
+
|
|
17
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
|
+
|
|
19
|
+
const name = 'beanstalk';
|
|
20
|
+
exports.name = name;
|
|
21
|
+
const description = 'Deploy Meteor app to AWS Elastic Beanstalk';
|
|
22
|
+
exports.description = description;
|
|
23
|
+
const commands = _commands;
|
|
24
|
+
exports.commands = commands;
|
|
25
|
+
const validate = {
|
|
26
|
+
app(config, utils) {
|
|
27
|
+
if (config.app && config.app.type === 'aws-beanstalk') {
|
|
28
|
+
return (0, _validate.default)(config, utils);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
};
|
|
35
|
+
exports.validate = validate;
|
|
36
|
+
|
|
37
|
+
function prepareConfig(config) {
|
|
38
|
+
if (!config.app || config.app.type !== 'aws-beanstalk') {
|
|
39
|
+
return config;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const defaultBuildOptions = {
|
|
43
|
+
serverOnly: true
|
|
44
|
+
};
|
|
45
|
+
config.app.buildOptions = config.app.buildOptions || defaultBuildOptions; // This will change 0 to 1. The validator will warn when the number is 0
|
|
46
|
+
// To have 0 instances, `mup stop` should be used
|
|
47
|
+
|
|
48
|
+
config.app.minInstances = config.app.minInstances || 1;
|
|
49
|
+
config.app.maxInstances = config.app.maxInstances || config.app.minInstances;
|
|
50
|
+
config.app.instanceType = config.app.instanceType || 't2.micro';
|
|
51
|
+
config.app.env = config.app.env || {};
|
|
52
|
+
config.app.env.PORT = 8081;
|
|
53
|
+
config.app.env.METEOR_SIGTERM_GRACE_PERIOD_SECONDS = 30;
|
|
54
|
+
config.app.oldVersions = config.app.oldVersions || 3;
|
|
55
|
+
return config;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function isBeanstalkApp(api) {
|
|
59
|
+
const config = api.getConfig();
|
|
60
|
+
|
|
61
|
+
if (config.app && config.app.type === 'aws-beanstalk') {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const hooks = {
|
|
69
|
+
'post.setup': api => {
|
|
70
|
+
if (isBeanstalkApp(api)) {
|
|
71
|
+
return api.runCommand('beanstalk.setup');
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
'post.deploy': api => {
|
|
75
|
+
if (isBeanstalkApp(api)) {
|
|
76
|
+
return api.runCommand('beanstalk.deploy');
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
'post.logs': api => {
|
|
80
|
+
if (isBeanstalkApp(api)) {
|
|
81
|
+
return api.runCommand('beanstalk.logs');
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
'post.start': api => {
|
|
85
|
+
if (isBeanstalkApp(api)) {
|
|
86
|
+
return api.runCommand('beanstalk.start');
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
'post.stop': api => {
|
|
90
|
+
if (isBeanstalkApp(api)) {
|
|
91
|
+
return api.runCommand('beanstalk.stop');
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
'post.restart': api => {
|
|
95
|
+
if (isBeanstalkApp(api)) {
|
|
96
|
+
return api.runCommand('beanstalk.restart');
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
'post.reconfig': api => {
|
|
100
|
+
if (isBeanstalkApp(api)) {
|
|
101
|
+
return api.runCommand('beanstalk.reconfig');
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
'post.status': api => {
|
|
105
|
+
if (isBeanstalkApp(api)) {
|
|
106
|
+
return api.runCommand('beanstalk.status');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
exports.hooks = hooks;
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["name","description","commands","_commands","validate","app","config","utils","type","prepareConfig","defaultBuildOptions","serverOnly","buildOptions","minInstances","maxInstances","instanceType","env","PORT","METEOR_SIGTERM_GRACE_PERIOD_SECONDS","oldVersions","isBeanstalkApp","api","getConfig","hooks","runCommand"],"mappings":"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","sourcesContent":["import * as _commands from './commands';\nimport validator from './validate';\n\nexport const name = 'beanstalk';\nexport const description = 'Deploy Meteor app to AWS Elastic Beanstalk';\nexport const commands = _commands;\n\nexport const validate = {\n app(config, utils) {\n if (config.app && config.app.type === 'aws-beanstalk') {\n return validator(config, utils);\n }\n\n return [];\n }\n};\n\nexport function prepareConfig(config) {\n if (!config.app || config.app.type !== 'aws-beanstalk') {\n return config;\n }\n\n const defaultBuildOptions = {\n serverOnly: true\n };\n\n config.app.buildOptions = config.app.buildOptions || defaultBuildOptions;\n\n // This will change 0 to 1. The validator will warn when the number is 0\n // To have 0 instances, `mup stop` should be used\n config.app.minInstances = config.app.minInstances || 1;\n config.app.maxInstances = config.app.maxInstances || config.app.minInstances;\n\n config.app.instanceType = config.app.instanceType || 't2.micro';\n\n config.app.env = config.app.env || {};\n config.app.env.PORT = 8081;\n config.app.env.METEOR_SIGTERM_GRACE_PERIOD_SECONDS = 30;\n\n config.app.oldVersions = config.app.oldVersions || 3;\n\n return config;\n}\n\nfunction isBeanstalkApp(api) {\n const config = api.getConfig();\n\n if (config.app && config.app.type === 'aws-beanstalk') {\n return true;\n }\n\n return false;\n}\n\nexport const hooks = {\n 'post.setup': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.setup');\n }\n },\n 'post.deploy': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.deploy');\n }\n },\n 'post.logs': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.logs');\n }\n },\n 'post.start': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.start');\n }\n },\n 'post.stop': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.stop');\n }\n },\n 'post.restart': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.restart');\n }\n },\n 'post.reconfig': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.reconfig');\n }\n },\n 'post.status': (api) => {\n if (isBeanstalkApp(api)) {\n return api.runCommand('beanstalk.status');\n }\n }\n};\n"],"file":"index.js"}
|
package/lib/policies.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.trailBucketPolicy = trailBucketPolicy;
|
|
7
|
+
exports.eventTargetRolePolicy = eventTargetRolePolicy;
|
|
8
|
+
exports.gracefulShutdownAutomationDocument = exports.deregisterEventTarget = exports.DeregisterEvent = exports.passRolePolicy = exports.eventTargetRole = exports.serviceRole = exports.rolePolicy = void 0;
|
|
9
|
+
|
|
10
|
+
function trailBucketPolicy(accountId, bucketName) {
|
|
11
|
+
const policy = {
|
|
12
|
+
Version: '2012-10-17',
|
|
13
|
+
Statement: [{
|
|
14
|
+
Sid: 'AWSCloudTrailAclCheck20150319',
|
|
15
|
+
Effect: 'Allow',
|
|
16
|
+
Principal: {
|
|
17
|
+
Service: 'cloudtrail.amazonaws.com'
|
|
18
|
+
},
|
|
19
|
+
Action: 's3:GetBucketAcl',
|
|
20
|
+
Resource: `arn:aws:s3:::${bucketName}`
|
|
21
|
+
}, {
|
|
22
|
+
Sid: 'AWSCloudTrailWrite20150319',
|
|
23
|
+
Effect: 'Allow',
|
|
24
|
+
Principal: {
|
|
25
|
+
Service: 'cloudtrail.amazonaws.com'
|
|
26
|
+
},
|
|
27
|
+
Action: 's3:PutObject',
|
|
28
|
+
Resource: `arn:aws:s3:::${bucketName}/AWSLogs/${accountId}/*`,
|
|
29
|
+
Condition: {
|
|
30
|
+
StringEquals: {
|
|
31
|
+
's3:x-amz-acl': 'bucket-owner-full-control'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}]
|
|
35
|
+
};
|
|
36
|
+
return JSON.stringify(policy);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const rolePolicy = '{ "Version": "2008-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }';
|
|
40
|
+
exports.rolePolicy = rolePolicy;
|
|
41
|
+
const serviceRole = '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "elasticbeanstalk.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "elasticbeanstalk" } } } ] }';
|
|
42
|
+
exports.serviceRole = serviceRole;
|
|
43
|
+
const eventTargetRole = '{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "Service": [ "ssm.amazonaws.com", "ec2.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }';
|
|
44
|
+
exports.eventTargetRole = eventTargetRole;
|
|
45
|
+
|
|
46
|
+
const passRolePolicy = (accountId, role) => {
|
|
47
|
+
const policy = {
|
|
48
|
+
Version: '2012-10-17',
|
|
49
|
+
Statement: [{
|
|
50
|
+
Effect: 'Allow',
|
|
51
|
+
Action: 'iam:PassRole',
|
|
52
|
+
Resource: `arn:aws:iam::${accountId}:role/${role}`
|
|
53
|
+
}]
|
|
54
|
+
};
|
|
55
|
+
return JSON.stringify(policy);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
exports.passRolePolicy = passRolePolicy;
|
|
59
|
+
|
|
60
|
+
function eventTargetRolePolicy(accountId, env, region) {
|
|
61
|
+
const policy = {
|
|
62
|
+
Version: '2012-10-17',
|
|
63
|
+
Statement: [{
|
|
64
|
+
Action: 'ssm:SendCommand',
|
|
65
|
+
Effect: 'Allow',
|
|
66
|
+
Resource: `arn:aws:ec2:${region}:${accountId}:instance/*`,
|
|
67
|
+
Condition: {
|
|
68
|
+
StringLike: {
|
|
69
|
+
'ssm:resourceTag/elasticbeanstalk:environment-name': [env]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}, {
|
|
73
|
+
Action: 'ssm:SendCommand',
|
|
74
|
+
Effect: 'Allow',
|
|
75
|
+
Resource: `arn:aws:ssm:${region}:*:document/AWS-RunShellScript`
|
|
76
|
+
}, {
|
|
77
|
+
Action: ['ssm:StartAutomationExecution', 'ssm:DescribeInstanceInformation', 'ssm:ListCommands', 'ssm:ListCommandInvocations'],
|
|
78
|
+
Effect: 'Allow',
|
|
79
|
+
Resource: ['*']
|
|
80
|
+
}]
|
|
81
|
+
};
|
|
82
|
+
return JSON.stringify(policy);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const DeregisterEvent = '{ "source": [ "aws.elasticloadbalancing" ], "detail-type": [ "AWS API Call via CloudTrail" ], "detail": { "eventSource": [ "elasticloadbalancing.amazonaws.com" ], "eventName": [ "DeregisterTargets" ] } }';
|
|
86
|
+
exports.DeregisterEvent = DeregisterEvent;
|
|
87
|
+
|
|
88
|
+
const deregisterEventTarget = (envName, role, accountId, region) => ({
|
|
89
|
+
Id: `mup-target-${envName}`,
|
|
90
|
+
Arn: `arn:aws:ssm:${region}:${accountId}:automation-definition/mup-graceful-shutdown:$LATEST`,
|
|
91
|
+
RoleArn: `arn:aws:iam::${accountId}:role/${role}`,
|
|
92
|
+
InputTransformer: {
|
|
93
|
+
InputPathsMap: {
|
|
94
|
+
instance: '$.detail.requestParameters.targets[0].id'
|
|
95
|
+
},
|
|
96
|
+
InputTemplate: `{"InstanceId":[<instance>], "AutomationAssumeRole": ["arn:aws:iam::${accountId}:role/${role}"], "ServiceRole": ["arn:aws:iam::${accountId}:role/${role}"], "Commands": ["cd /mup_graceful_shutdown || exit 1", "ls", "PATH='/mup_graceful_shutdown'", <instance>]}`
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
exports.deregisterEventTarget = deregisterEventTarget;
|
|
101
|
+
|
|
102
|
+
const gracefulShutdownAutomationDocument = () => {
|
|
103
|
+
const document = {
|
|
104
|
+
description: 'Automation document for mup-aws-beanstalk graceful shutdown',
|
|
105
|
+
schemaVersion: '0.3',
|
|
106
|
+
assumeRole: '{{ AutomationAssumeRole }}',
|
|
107
|
+
parameters: {
|
|
108
|
+
InstanceId: {
|
|
109
|
+
type: 'StringList',
|
|
110
|
+
description: '(Required) EC2 Instance(s) to run the command on'
|
|
111
|
+
},
|
|
112
|
+
AutomationAssumeRole: {
|
|
113
|
+
type: 'String',
|
|
114
|
+
description: '(Optional) The ARN of the role that allows Automation to perform the actions on your behalf.',
|
|
115
|
+
default: ''
|
|
116
|
+
},
|
|
117
|
+
Commands: {
|
|
118
|
+
type: 'StringList',
|
|
119
|
+
description: 'Commands to run'
|
|
120
|
+
},
|
|
121
|
+
ServiceRole: {
|
|
122
|
+
type: 'String',
|
|
123
|
+
description: 'The ARN of the role for runCommand'
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
mainSteps: [{
|
|
127
|
+
name: 'runCommand',
|
|
128
|
+
action: 'aws:runCommand',
|
|
129
|
+
timeoutSeconds: 10,
|
|
130
|
+
inputs: {
|
|
131
|
+
DocumentName: 'AWS-RunShellScript',
|
|
132
|
+
InstanceIds: '{{ InstanceId }}',
|
|
133
|
+
ServiceRoleArn: '{{ ServiceRole }}',
|
|
134
|
+
Parameters: {
|
|
135
|
+
commands: '{{ Commands }}'
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}]
|
|
139
|
+
};
|
|
140
|
+
return JSON.stringify(document);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
exports.gracefulShutdownAutomationDocument = gracefulShutdownAutomationDocument;
|
|
144
|
+
//# sourceMappingURL=policies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/policies.js"],"names":["trailBucketPolicy","accountId","bucketName","policy","Version","Statement","Sid","Effect","Principal","Service","Action","Resource","Condition","StringEquals","JSON","stringify","rolePolicy","serviceRole","eventTargetRole","passRolePolicy","role","eventTargetRolePolicy","env","region","StringLike","DeregisterEvent","deregisterEventTarget","envName","Id","Arn","RoleArn","InputTransformer","InputPathsMap","instance","InputTemplate","gracefulShutdownAutomationDocument","document","description","schemaVersion","assumeRole","parameters","InstanceId","type","AutomationAssumeRole","default","Commands","ServiceRole","mainSteps","name","action","timeoutSeconds","inputs","DocumentName","InstanceIds","ServiceRoleArn","Parameters","commands"],"mappings":"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","sourcesContent":["export function trailBucketPolicy(accountId, bucketName) {\n const policy = {\n Version: '2012-10-17',\n Statement: [{\n Sid: 'AWSCloudTrailAclCheck20150319',\n Effect: 'Allow',\n Principal: {\n Service: 'cloudtrail.amazonaws.com'\n },\n Action: 's3:GetBucketAcl',\n Resource: `arn:aws:s3:::${bucketName}`\n },\n {\n Sid: 'AWSCloudTrailWrite20150319',\n Effect: 'Allow',\n Principal: {\n Service: 'cloudtrail.amazonaws.com'\n },\n Action: 's3:PutObject',\n Resource: `arn:aws:s3:::${bucketName}/AWSLogs/${accountId}/*`,\n Condition: {\n StringEquals: {\n 's3:x-amz-acl': 'bucket-owner-full-control'\n }\n }\n }\n ]\n };\n\n return JSON.stringify(policy);\n}\n\nexport const rolePolicy = '{ \"Version\": \"2008-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"ec2.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\" } ] }';\nexport const serviceRole = '{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"elasticbeanstalk.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\", \"Condition\": { \"StringEquals\": { \"sts:ExternalId\": \"elasticbeanstalk\" } } } ] }';\nexport const eventTargetRole = '{ \"Version\": \"2012-10-17\", \"Statement\": [{ \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"events.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\" }, { \"Effect\": \"Allow\", \"Principal\": { \"Service\": [ \"ssm.amazonaws.com\", \"ec2.amazonaws.com\" ] }, \"Action\": \"sts:AssumeRole\" } ] }';\nexport const passRolePolicy = (accountId, role) => {\n const policy = {\n Version: '2012-10-17',\n Statement: [\n {\n Effect: 'Allow',\n Action: 'iam:PassRole',\n Resource: `arn:aws:iam::${accountId}:role/${role}`\n }\n ]\n };\n\n return JSON.stringify(policy);\n};\n\nexport function eventTargetRolePolicy(accountId, env, region) {\n const policy = {\n Version: '2012-10-17',\n Statement: [\n {\n Action: 'ssm:SendCommand',\n Effect: 'Allow',\n Resource: `arn:aws:ec2:${region}:${accountId}:instance/*`,\n Condition: {\n StringLike: {\n 'ssm:resourceTag/elasticbeanstalk:environment-name': [\n env\n ]\n }\n }\n },\n {\n Action: 'ssm:SendCommand',\n Effect: 'Allow',\n Resource: `arn:aws:ssm:${region}:*:document/AWS-RunShellScript`\n },\n {\n Action: [\n 'ssm:StartAutomationExecution',\n 'ssm:DescribeInstanceInformation',\n 'ssm:ListCommands',\n 'ssm:ListCommandInvocations'\n ],\n Effect: 'Allow',\n Resource: [\n '*'\n ]\n }\n ]\n };\n\n return JSON.stringify(policy);\n}\n\nexport const DeregisterEvent = '{ \"source\": [ \"aws.elasticloadbalancing\" ], \"detail-type\": [ \"AWS API Call via CloudTrail\" ], \"detail\": { \"eventSource\": [ \"elasticloadbalancing.amazonaws.com\" ], \"eventName\": [ \"DeregisterTargets\" ] } }';\n\nexport const deregisterEventTarget = (envName, role, accountId, region) => ({\n Id: `mup-target-${envName}`,\n Arn: `arn:aws:ssm:${region}:${accountId}:automation-definition/mup-graceful-shutdown:$LATEST`,\n RoleArn: `arn:aws:iam::${accountId}:role/${role}`,\n InputTransformer: {\n InputPathsMap: {\n instance: '$.detail.requestParameters.targets[0].id'\n },\n InputTemplate: `{\"InstanceId\":[<instance>], \"AutomationAssumeRole\": [\"arn:aws:iam::${accountId}:role/${role}\"], \"ServiceRole\": [\"arn:aws:iam::${accountId}:role/${role}\"], \"Commands\": [\"cd /mup_graceful_shutdown || exit 1\", \"ls\", \"PATH='/mup_graceful_shutdown'\", <instance>]}`\n }\n});\n\nexport const gracefulShutdownAutomationDocument = () => {\n const document = {\n description: 'Automation document for mup-aws-beanstalk graceful shutdown',\n schemaVersion: '0.3',\n assumeRole: '{{ AutomationAssumeRole }}',\n parameters: {\n InstanceId: {\n type: 'StringList',\n description: '(Required) EC2 Instance(s) to run the command on'\n },\n AutomationAssumeRole: {\n type: 'String',\n description: '(Optional) The ARN of the role that allows Automation to perform the actions on your behalf.',\n default: ''\n },\n Commands: {\n type: 'StringList',\n description: 'Commands to run'\n },\n ServiceRole: {\n type: 'String',\n description: 'The ARN of the role for runCommand'\n }\n },\n mainSteps: [\n {\n name: 'runCommand',\n action: 'aws:runCommand',\n timeoutSeconds: 10,\n inputs: {\n DocumentName: 'AWS-RunShellScript',\n InstanceIds: '{{ InstanceId }}',\n ServiceRoleArn: '{{ ServiceRole }}',\n Parameters: {\n commands: '{{ Commands }}'\n }\n }\n }\n ]\n };\n\n return JSON.stringify(document);\n};\n"],"file":"policies.js"}
|