Commit 820559a8 authored by Erik Schwartz's avatar Erik Schwartz 🉐
Browse files

Merge branch 'handle-env' into 'master'

Explicitly require AWS env variables

See merge request !6
parents 8cd3acf7 43a34887
......@@ -11,38 +11,29 @@ Tested with: [Node.js v14 LTS]( and [AWS SDK for Javascript]
1. Download and install Node.js LTS
2. Clone this repository
3. Install dependences: `npm ci --production`
4. [Optional] Copy the example file: `cp settings/demo.json.EXAMPLE settings/foo.json`
5. [Optional] Edit `settings/foo.json` to specify an AWS Region and IAM service account
### Export Node.js variables
### Export AWS variables
export NODE_PATH=${_node}/lib/node_modules
export PATH=${_node}/bin:$PATH
export AWS_ACCESS_KEY_ID='bbaa'
export AWS_REGION='us-east-2'
## Use it
### Run without args to see options
## Run
node app.js
Usage: app.js --name baz [--profile foo.json]
node app.js --name BazNotebook
The `--name` option should specify the SageMaker notebook name. If `--profile` is not provided, the caller should export AWS environment variables:
* [Setting the AWS Region](
* [Loading credentials from environment variables](
This approach can be used for CI build jobs.
The `--name` option should specify the SageMaker notebook name to be stopped.
# IAM policy
IAM policy suggestion for AWS service account:
The IAM service account that you configure in `settings/foo.json` will need certain authorizations. Suggested starting point for an IAM policy:
"Version": "2012-10-17",
......@@ -6,11 +6,13 @@
// ----------------------------------------------------------------------------
const appDebug = require('debug')('iq:sm');
const path = require('path');
const AWS = require('aws-sdk');
const process = require('process');
const appDebug = require('debug')('iq:sm');
const argv = require('minimist')(process.argv.slice(2));
const defaultApiVersion = '2017-07-24';
const AWS = require('aws-sdk');
const AWS_API_VERSION = '2017-07-24';
// ----------------------------------------------------------------------------
......@@ -28,13 +30,28 @@ function printUsageAndExit() {
* Audit CLI args to confirm notebook name was provided.
* @param {object} o - CLI args.
* @returns {boolean} True if valid args.
function auditNotebookName(o) {
function areCliArgsValid(o) {
appDebug('CLI args:');
const prop = 'name';
if (!o || !o.hasOwnProperty(prop)) printUsageAndExit();
if (!o[prop] || typeof o[prop] !== 'string') printUsageAndExit();
if (!o || !o.hasOwnProperty(prop)) return false;
if (!o[prop] || typeof o[prop] !== 'string') return false;
return true;
* Check whether variable is set in the environment.
* @param {string} name - Name of environment variable.
* @returns {boolean} True if variable is set and has a truthy value.
function isSetInEnv(name) {
appDebug(`Checking if ${name} is set`);
if (!process.env.hasOwnProperty(name)) return false;
if (!process.env[name]) return false;
return true;
......@@ -73,6 +90,11 @@ function bringDownInstance(sm, notebook) {
// ----------------------------------------------------------------------------
const sm = new AWS.SageMaker({apiVersion: defaultApiVersion});
if (!areCliArgsValid(argv)) printUsageAndExit();
AWS_ENV.forEach(x => {
if (!isSetInEnv(x)) throw new Error(`Set ${x} in your environment`);
const sm = new AWS.SageMaker({apiVersion: AWS_API_VERSION});
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment