Skip to content

Instantly share code, notes, and snippets.

@codelinx
Forked from sonodar/get_ssm_parameters.js
Created January 29, 2019 04:44
Show Gist options
  • Save codelinx/1db2df54694b27a513661b091f39b743 to your computer and use it in GitHub Desktop.
Save codelinx/1db2df54694b27a513661b091f39b743 to your computer and use it in GitHub Desktop.

Revisions

  1. @sonodar sonodar revised this gist Dec 26, 2017. 1 changed file with 0 additions and 59 deletions.
    59 changes: 0 additions & 59 deletions GetParameters.java
    Original file line number Diff line number Diff line change
    @@ -1,59 +0,0 @@
    import java.nio.file.Paths;
    import java.util.Objects;
    import java.util.Optional;
    import java.util.function.Consumer;

    import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagement;
    import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClientBuilder;
    import com.amazonaws.services.simplesystemsmanagement.model.GetParametersByPathRequest;
    import com.amazonaws.services.simplesystemsmanagement.model.GetParametersByPathResult;
    import com.amazonaws.services.simplesystemsmanagement.model.Parameter;

    public class GetParameters {

    private static final String PRINT_FORMAT = "%s=\"%s\"";

    private final GetParametersByPathRequest baseRequest;

    private final AWSSimpleSystemsManagement ssm;

    private GetParameters(final String pathPrefix) {
    final String path = Objects.requireNonNull(pathPrefix, "pathPrefix is required.");
    this.baseRequest = new GetParametersByPathRequest().withPath(path).withRecursive(true).withWithDecryption(true);
    this.ssm = AWSSimpleSystemsManagementClientBuilder.defaultClient();
    }

    private GetParametersByPathResult getParametersByPath(final Optional<String> nextToken) {
    final GetParametersByPathRequest request = nextToken.map(baseRequest.clone()::withNextToken).orElse(baseRequest);
    return this.ssm.getParametersByPath(request);
    }

    private void parameters(Consumer<Parameter> process) {
    Optional<String> nextToken = Optional.empty();
    while (true) {
    final GetParametersByPathResult result = getParametersByPath(nextToken);
    if (result.getParameters().isEmpty()) {
    return;
    }
    result.getParameters().stream().forEach(process);
    if (result.getNextToken() == null) {
    return;
    }
    nextToken = Optional.of(result.getNextToken());
    }
    }

    private static void printParameter(final Parameter parameter) {
    final String envName = Paths.get(parameter.getName()).getFileName().toString();
    System.out.println(String.format(PRINT_FORMAT, envName, parameter.getValue()));
    }

    public static void main(final String... args) {
    if (args.length == 0) {
    System.err.println("Usage: java GetParameters pathPrefix");
    System.exit(1);
    }
    new GetParameters(args[0]).parameters(GetParameters::printParameter);
    }

    }
  2. @sonodar sonodar revised this gist Dec 26, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion GetParameters.java
    Original file line number Diff line number Diff line change
    @@ -24,7 +24,7 @@ private GetParameters(final String pathPrefix) {
    }

    private GetParametersByPathResult getParametersByPath(final Optional<String> nextToken) {
    final GetParametersByPathRequest request = nextToken.map(baseRequest::withNextToken).orElse(baseRequest);
    final GetParametersByPathRequest request = nextToken.map(baseRequest.clone()::withNextToken).orElse(baseRequest);
    return this.ssm.getParametersByPath(request);
    }

  3. @sonodar sonodar revised this gist Dec 26, 2017. 1 changed file with 59 additions and 0 deletions.
    59 changes: 59 additions & 0 deletions GetParameters.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    import java.nio.file.Paths;
    import java.util.Objects;
    import java.util.Optional;
    import java.util.function.Consumer;

    import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagement;
    import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClientBuilder;
    import com.amazonaws.services.simplesystemsmanagement.model.GetParametersByPathRequest;
    import com.amazonaws.services.simplesystemsmanagement.model.GetParametersByPathResult;
    import com.amazonaws.services.simplesystemsmanagement.model.Parameter;

    public class GetParameters {

    private static final String PRINT_FORMAT = "%s=\"%s\"";

    private final GetParametersByPathRequest baseRequest;

    private final AWSSimpleSystemsManagement ssm;

    private GetParameters(final String pathPrefix) {
    final String path = Objects.requireNonNull(pathPrefix, "pathPrefix is required.");
    this.baseRequest = new GetParametersByPathRequest().withPath(path).withRecursive(true).withWithDecryption(true);
    this.ssm = AWSSimpleSystemsManagementClientBuilder.defaultClient();
    }

    private GetParametersByPathResult getParametersByPath(final Optional<String> nextToken) {
    final GetParametersByPathRequest request = nextToken.map(baseRequest::withNextToken).orElse(baseRequest);
    return this.ssm.getParametersByPath(request);
    }

    private void parameters(Consumer<Parameter> process) {
    Optional<String> nextToken = Optional.empty();
    while (true) {
    final GetParametersByPathResult result = getParametersByPath(nextToken);
    if (result.getParameters().isEmpty()) {
    return;
    }
    result.getParameters().stream().forEach(process);
    if (result.getNextToken() == null) {
    return;
    }
    nextToken = Optional.of(result.getNextToken());
    }
    }

    private static void printParameter(final Parameter parameter) {
    final String envName = Paths.get(parameter.getName()).getFileName().toString();
    System.out.println(String.format(PRINT_FORMAT, envName, parameter.getValue()));
    }

    public static void main(final String... args) {
    if (args.length == 0) {
    System.err.println("Usage: java GetParameters pathPrefix");
    System.exit(1);
    }
    new GetParameters(args[0]).parameters(GetParameters::printParameter);
    }

    }
  4. @sonodar sonodar revised this gist Dec 26, 2017. 1 changed file with 31 additions and 0 deletions.
    31 changes: 31 additions & 0 deletions get_ssm_parameters.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    if (process.argv.length < 3) {
    throw `Usage: ${process.argv[1]} path_prefix`
    }
    const PATH_PREFIX = process.argv[2]

    const path = require('path')
    const AWS = require('aws-sdk')
    const ssm = new AWS.SSM()

    function getParametersByPath(nextToken, callback) {
    const params = { Path: PATH_PREFIX, Recursive: true, WithDecryption: true }
    if (nextToken) params['NextToken'] = nextToken
    ssm.getParametersByPath(params, (err, data) => {
    if (err) throw err
    callback(data)
    })
    }

    function printParameter(parameter) {
    const envName = path.basename(parameter.Name)
    console.log(`${envName}="${parameter.Value}"`)
    }

    function handleResponse(response) {
    if (response.Parameters.length === 0) return
    response.Parameters.forEach(printParameter)
    if (!response.NextToken) return
    getParametersByPath(response.NextToken, handleResponse)
    }

    getParametersByPath(null, handleResponse)
  5. @sonodar sonodar revised this gist Dec 26, 2017. 2 changed files with 81 additions and 0 deletions.
    46 changes: 46 additions & 0 deletions get_ssm_parameters.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,46 @@
    #!/usr/bin/env python

    from os import path
    from sys import argv
    import boto3

    if len(argv) < 2:
    raise "Usage: %s path" % argv[0]

    PATH = argv[1]
    SSM = boto3.client('ssm')

    def get_parameters_by_path(next_token = None):
    params = {
    'Path': PATH,
    'Recursive': True,
    'WithDecryption': True
    }
    if next_token is not None:
    params['NextToken'] = next_token
    return SSM.get_parameters_by_path(**params)

    def parameters():
    next_token = None
    while True:
    response = get_parameters_by_path(next_token)
    parameters = response['Parameters']
    if len(parameters) == 0:
    break
    for parameter in parameters:
    yield parameter
    if 'NextToken' not in response:
    break
    next_token = response['NextToken']

    def print_env_vars(parameter):
    env_name = path.basename(parameter['Name'])
    env_value = parameter['Value']
    print("%s=\"%s\"" % (env_name, env_value))

    def main():
    for parameter in parameters():
    print_env_vars(parameter)

    if __name__ == "__main__":
    main()
    35 changes: 35 additions & 0 deletions get_ssm_parameters.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    #!/usr/bin/env ruby
    require 'aws-sdk'
    raise "Usage: #{$0} path" if ARGV[0].nil?

    PATH = ARGV[0]
    SSM = Aws::SSM::Client.new

    def get_parameters_by_path(next_token = nil)
    params = {
    path: PATH,
    recursive: true,
    with_decryption: true,
    }
    params[:next_token] = next_token unless next_token.nil?
    SSM.get_parameters_by_path(params)
    end

    def parameters
    next_token = nil
    while true
    response = get_parameters_by_path(next_token)
    break if response.parameters.empty?
    response.parameters.each { |parameter| yield parameter }
    next_token = response.next_token
    break if next_token.nil?
    end
    end

    def print_env_vars(parameter)
    env_name = File.basename(parameter.name)
    env_value = parameter.value
    puts "#{env_name}=\"#{env_value}\""
    end

    parameters { |p| print_env_vars p }
  6. @sonodar sonodar revised this gist Dec 26, 2017. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions get_ssm_parameters.sh
    Original file line number Diff line number Diff line change
    @@ -12,6 +12,9 @@
    # "Resource": "arn:aws:ssm:YOUR_REGION:YOUR_AWS_ACCOUNT_ID:parameter/app/api/staging/*"
    # }]
    # }

    # jq is required.

    if [ $# -lt 2 ]; then
    echo "Usage: $0 aws_region path_prefix" 1>&2
    exit 1
  7. @sonodar sonodar revised this gist Dec 26, 2017. 1 changed file with 36 additions and 40 deletions.
    76 changes: 36 additions & 40 deletions get_ssm_parameters.sh
    Original file line number Diff line number Diff line change
    @@ -1,60 +1,56 @@
    #!/bin/bash +x
    # Usage: get_ssm_parameters.sh [prefix]
    # prefix: SSM Parameter Path prefix (ex. /app/api/staging)
    #!/usr/bin/env bash +x
    # Usage: get_ssm_parameters.sh aws_region path_prefix
    # $1 aws_region : SSM Parameter Region (ex. ap-northeast-1)
    # $2 path_prefix: SSM Parameter Path prefix (ex. /app/api/staging)
    # IAM Policy example:
    # {
    # "Version": "",
    # "Statement": [{
    # "Sid": ""
    # "Effect": "Allow"
    # "Action": ["ssm:GetParameter*]"
    # "Action": ["ssm:GetParametersByPath]"
    # "Resource": "arn:aws:ssm:YOUR_REGION:YOUR_AWS_ACCOUNT_ID:parameter/app/api/staging/*"
    # }]
    # }

    if [[ -z $1 ]]; then
    echo 'Usage: $0 [prefix]' 1>&2
    if [ $# -lt 2 ]; then
    echo "Usage: $0 aws_region path_prefix" 1>&2
    exit 1
    fi

    # @param $1 Path prefix
    describe_parameter_names() {
    local prefix="${1}"
    aws ssm describe-parameters --parameter-filters "Key=Path,Option=Recursive,Values=${prefix}" \
    --query 'Parameters[*].Name' --output text
    readonly AWS_REGION="${1}"
    readonly PATH_PREFIX="${2}"

    # $1 nextToken
    get_parameters_by_path() {
    local nextToken="${1}"
    aws ssm get-parameters-by-path --region "${AWS_REGION}" \
    --path "${PATH_PREFIX}" --recursive --with-decryption \
    $([ -z ${nextToken} ] || echo "--next-token ${nextToken}")
    }

    # @param $1 Parameter name
    get_parameter_value() {
    local parameterName="${1}"
    local parameterValue=$(aws ssm get-parameter --name "${parameterName}" \
    --query 'Parameter.Value' --output text --with-decryption)
    [[ ${parameterValue} == "None" ]] && return 1
    echo ${parameterValue}
    # $1 parameterName
    # $2 parameterValue
    print_env_vars() {
    local envName=$(basename "${1}")
    local envValue="${2}"
    echo "${envName}=\"${envValue}\""
    }

    # @param $1 Path prefix
    output_parameter_values() {
    local prefix="${1}"
    declare -i hasError=0
    for name in $(describe_parameter_names ${prefix}); do
    value=$(get_parameter_value ${name})
    if [ $? -ne 0 ]; then
    echo "Can't get parameter, parameter_name=${name}" 1>&2
    hasError=1; continue
    print_parameters() {
    local nextToken=""
    while true; do
    responseJson=$(get_parameters_by_path "${nextToken}")
    declare -i parameterCount=$(echo ${responseJson} | jq -c '.Parameters[].Name' | wc -l)
    [ ${parameterCount} -lt 1 ] && break
    echo $responseJson | jq -r '.Parameters[]|[.Name,.Value] | @sh' | while read LINE; do
    declare -a nameAndValue=($(echo $LINE | tr -d \'))
    print_env_vars ${nameAndValue[@]}
    done
    nextToken=$(echo ${responseJson} | jq -r '.NextToken')
    if [ -z ${nextToken} ] || [[ ${nextToken} == "null" ]]; then
    break
    fi
    envName=$(basename ${name} || echo 'NULL')
    echo "${envName}=${value}"
    done
    return ${hasError}
    }

    AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g')
    AWS_AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
    AWS_REGION=$(echo ${AWS_AZ} | sed -e 's/.$//g')
    aws configure set region "${AWS_REGION}"
    echo "AWS_REGION=${AWS_REGION}"
    echo "AWS_AZ=${AWS_AZ}"
    echo "EC2_INSTANCE_ID=${EC2_INSTANCE_ID}"

    output_parameter_values "$1"
    print_parameters
  8. @sonodar sonodar created this gist Dec 25, 2017.
    60 changes: 60 additions & 0 deletions get_ssm_parameters.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,60 @@
    #!/bin/bash +x
    # Usage: get_ssm_parameters.sh [prefix]
    # prefix: SSM Parameter Path prefix (ex. /app/api/staging)
    # IAM Policy example:
    # {
    # "Version": "",
    # "Statement": [{
    # "Sid": ""
    # "Effect": "Allow"
    # "Action": ["ssm:GetParameter*]"
    # "Resource": "arn:aws:ssm:YOUR_REGION:YOUR_AWS_ACCOUNT_ID:parameter/app/api/staging/*"
    # }]
    # }

    if [[ -z $1 ]]; then
    echo 'Usage: $0 [prefix]' 1>&2
    exit 1
    fi

    # @param $1 Path prefix
    describe_parameter_names() {
    local prefix="${1}"
    aws ssm describe-parameters --parameter-filters "Key=Path,Option=Recursive,Values=${prefix}" \
    --query 'Parameters[*].Name' --output text
    }

    # @param $1 Parameter name
    get_parameter_value() {
    local parameterName="${1}"
    local parameterValue=$(aws ssm get-parameter --name "${parameterName}" \
    --query 'Parameter.Value' --output text --with-decryption)
    [[ ${parameterValue} == "None" ]] && return 1
    echo ${parameterValue}
    }

    # @param $1 Path prefix
    output_parameter_values() {
    local prefix="${1}"
    declare -i hasError=0
    for name in $(describe_parameter_names ${prefix}); do
    value=$(get_parameter_value ${name})
    if [ $? -ne 0 ]; then
    echo "Can't get parameter, parameter_name=${name}" 1>&2
    hasError=1; continue
    fi
    envName=$(basename ${name} || echo 'NULL')
    echo "${envName}=${value}"
    done
    return ${hasError}
    }

    AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g')
    AWS_AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
    AWS_REGION=$(echo ${AWS_AZ} | sed -e 's/.$//g')
    aws configure set region "${AWS_REGION}"
    echo "AWS_REGION=${AWS_REGION}"
    echo "AWS_AZ=${AWS_AZ}"
    echo "EC2_INSTANCE_ID=${EC2_INSTANCE_ID}"

    output_parameter_values "$1"