Удалите ключ (и) / значение (я) из хранилища параметров SSM, если его нет в локальном файле application.properties - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть сценарий python для чтения файлов application.properties из папки и создания / обновления их в хранилище параметров SSM. В настоящее время, если есть свойство, которого больше нет в локальном файле application.properties, но существует в SSM, его необходимо удалить из SSM вручную. Я хочу автоматизировать этот процесс удаления таким образом, чтобы в SSM был ключ / значение, которого нет в локальном файле application.properties, ключ / значение следует удалить из SSM.

Я проверил, что * В библиотеке 1003 * boto3 есть функция delete_parameter (), но это удаляет хранилище параметров. В нем нет условия для удаления только пары ключ / значение. Функция put_parameter () позволяет поставить конкретный ключ / значение, но я не буду помещать какое-либо значение в этом случае, скорее я хочу удалить его из SSM.

Я включил часть своего кода ниже :

import os
import json
import boto3
import logging
from botocore.vendored import requests

root_dir = "./parameterstore/"
NAME = '/myApp/'
environment = os.environ['environment']
client = boto3.client('ssm')
logger = logging.getLogger()
logger.setLevel(logging.INFO)
responseStatus = 'SUCCESS'

def lambda_handler(event, context):
    #Get local application.properties files
    files = get_ssm_local_files() 
    count = 0
    for file in files:
        remote_key_vals = get_ssm_paramstore_values(file) #get keys from ssm
        local_key_vals = read_ssm_local_file(file) #get keys from local properties file
        if(len(remote_key_vals)==0):
            create_ssm_paramstore(file) #if nothing exists in ssm, then create properties file in ssm
            count=count+1
        elif(local_key_vals>remote_key_vals):
            difference = local_key_vals-remote_key_vals
            if(len(difference)>0):
                update_ssm_paramstore(file, difference)
                count=count+1
        elif(remote_key_vals>local_key_vals):
            difference=remote_key_vals - local_key_vals
            if(len(difference)>0):
               delete_ssm_paramstore(file, difference)
               count = count+1
        else:
            logger.info(file+' already exist')
        logger.info(local_key_vals)
    try:
        req = requests.put(event['ResponseURL'],
                          data=getResponse(event, context,
                                            responseStatus))
        if req.status_code != 200:
            logger.info(req.text)
            raise Exception('Received non 200 response while sending response to CFN.'
                            )
    except requests.exceptions.RequestException, e:
        logger.info(e)
        raise
    return

def update_ssm_paramstore(filename, differences):
    file = open(root_dir+filename, 'r')
    content=''
    for line in file:
        for diff in differences:
            if(line.startswith(diff)):
                 content = content +'\n'+ line
    existing_param = get_ssm_parameterstore(filename)
    content = existing_param + content
    ssm_param_name = NAME+environment + '/' + filename
    response = client.put_parameter(Name=ssm_param_name,
                                Description = filename,
                                Value=content,
                                Type='SecureString', Overwrite=True)
    logger.info('update_ssm_paramstore - parameterstore update success') 

def get_ssm_parameterstore(filename):
    ssm_param_name = NAME+environment + '/' + filename
    try:
        logger.info('get_ssm_parameterstore - parameterstore name:%s ' % ssm_param_name)
        response = client.get_parameter(Name=ssm_param_name,
                                        WithDecryption=True)
        ssm_get_existing_string = response['Parameter']['Value']
    except client.exceptions.ParameterNotFound:
        logger.error('exception ParameterStore %s NotFound ' % ssm_param_name)
        ssm_get_existing_string = ''
    return ssm_get_existing_string 

Обновление: Я создал функцию delete_ssm_paramstore () для удаления ключей / значений, существующих в SSM.

def delete_ssm_paramstore(filename, differences):
    file = open(root_dir+filename, 'r')
    content =''
    for line in file:
        for diff in differences:
            if (diff not in line):
                content = content + line
    ssm_param_name = NAME+environment + '/' + filename
    response = client.put_parameter(Name=ssm_param_name,
                                    Description = filename,
                                    Value=content,
                                    Type='SecureString', Overwrite=True)
    logger.info('delete_ssm_paramstore - parameterstore delete success')

У меня есть файл свойств приложения в SSM, как показано ниже:

NAME=
ID=
TYPE=

Сценарий удаляет ключ "Name" из SSM (так как его нет в локальном файле), но когда я go в SSM, я вижу это:

ID=
ID=
TYPE=
TYPE=

Интересно, почему он добавляет каждый существующий параметр дважды. Есть ли проблема с моим l oop в delete_ssm_paramstore () ? Я заметил, что это происходит при первом запуске скрипта, и при каждом последующем запуске я не вижу этой проблемы. Если кто-нибудь знает, почему это происходит только один раз, пожалуйста, дайте мне знать.

Заранее спасибо!

...