У меня есть сценарий 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 () ? Я заметил, что это происходит при первом запуске скрипта, и при каждом последующем запуске я не вижу этой проблемы. Если кто-нибудь знает, почему это происходит только один раз, пожалуйста, дайте мне знать.
Заранее спасибо!