Il servizio Systems Manager, spesso abbreviato con la sigla SSM, mette a disposizione un Parameter Store per la gestione di valori dinamici che possono essere usati come parametri nei template CloudFormation. Questa tecnica viene molto usata per usare lo stesso template in account diversi per creare livelli di ambienti diversi (dev/test/produzione) oppure replicare più volte la stessa infrastruttura in più istanze (per esempio per clienti diversi in account diversi). Secondo la documentazione ufficiale l’utilizzo dei parametri con SSM non prevede nessun costo aggiuntivo a meno che non si decida di usare parametri di tipo avanzato, in questo articolo saranno usati solo i tipi standard.
Da console è possibile vedere l’elenco di tutti i parametri, il tipo e la data di modifica, ovviamente è possibile creare e modificare i parametri esistenti:
Nella guida ufficiale sono descritti tutti i passi e le modalità per la creazione dei parametri, in particolare come standard è possibile vedere che i nomi dei parametri sono impostati con
/livello1/livello2/.../nome-parametro
in questo modo è possibile creare una sorta di gerarchia dove ogni livello raggruppa i successivi. Per esempio tutte i parametri di una applicazione possono essere creati con:
/nome-applicazione/ambito1/nome-parametro1 /nome-applicazione/ambito1/nome-parametro2 /nome-applicazione/ambito2/nome-parametro3
Questo standard è suggerito anche per somigliare ad alcuni parametri che sono messi a disposizione da AWS come parametri di architettura, l’elenco dei parametri ufficiali è disponibile nel sito ufficiale e può essere usata in CloudFormation ma in qualsiasi altro punto del Cloud.
La CLI mette a disposizione una serie di comodi comandi per la gestione di questi parametri, l’elenco completo dei parametri
aws ssm describe-parameters aws ssm describe-parameters --output table --query 'Parameters[*].[Name,Type,Description]'
I parametri comuni messi a disposizione da AWS possono essere recuperati con lo stesso comando
aws ssm get-parameters-by-path --path "/aws/service/ami-amazon-linux-latest" --query "Parameters[].Name"
Per creare un nuovo parametro è possibile eseguire
aws ssm put-parameter --overwrite --profile default --name "/ambito/nome-parametro" --type String --value "valore del parametro"
Con le librerie SDK messe a disposizione di AWS è possibile gestire questo servizio, i principali metodi per leggere e scrivere nella tabella dei parametri sono:
def get_parameters_by_path(profile_name,path): boto3.setup_default_session(profile_name=profile_name) ssm = boto3.client('ssm') #, 'us-east-2' paginator = ssm.get_paginator('get_parameters_by_path') response_iterator = paginator.paginate( Path=path,Recursive=True,WithDecryption=True#,MaxResults=123, ) parameters=[] for page in response_iterator: for entry in page['Parameters']: parameters.append(entry) return parameters def put_parameter(profile_name, name, value, type, description): boto3.setup_default_session(profile_name=profile_name) ssm = boto3.client('ssm') #, 'us-east-2' response = ssm.put_parameter( Name=name, Description=description, Value=value, Type=type, #'String'|'StringList'|'SecureString', Overwrite=True, #|False, Tier='Standard',#|'Advanced'|'Intelligent-Tiering', ) return response
L’uso di questo servizio è molto potente quando si vuole recuperare da CloudFormation dei parametri dinamici da SSM, per fare esiste proprio un tipo di parametro specifico:
Parameters: InstanceType: Type: AWS::SSM::Parameter::Value<String> Default: /nao/ec2/instenceType ImageId: Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
grazie a questa tecnica è possibile recuperare un valore di un parametro personalizzato ma anche da un parametro pubblici di AWS, per esempio recuperare l’ultima immagine ami disponibile di un determinato tipo. Questi parametri possono poi essere usati nei template:
Resources: Ec2Instance: Type: AWS::EC2::Instance Properties: InstanceType: !Ref InstanceType ImageId: !Ref ImageId NetworkInterfaces: - GroupSet: - Ref: SecurityGroup AssociatePublicIpAddress: true DeviceIndex: '0' DeleteOnTermination: true
Nel template di esempio:
https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio09parametriSSM
è possibile notare come è possibile recuperare valori da SSM e passarli ad un template con la tecnica del “nested stacks” già presentata nei precedenti articoli. Tramite template CloudFormation è possibile anche creare parametri come risorsa di uno stack, nei template è possibile inserire le risorse:
Parametro: Type: AWS::SSM::Parameter Properties: Description: 'Descrizione CF' Name: '/dev/provaCF' Tier: 'Standard' Type: 'String' # SecureString | String | StringList Value: 'valore che arriva da cloudFormation'
Questa tecnica è usata anche per salvare in uno store centrale e unico le password e le chiavi chiamate “SecureString“, questo tipo di parametri sono salvati nel servizio in maniera cifrata, tramite questa tecnica è possibile salvare chiavi private pem o password in modo che altri servizi possano recuperarle senza problemi di sicurezza. Per esempio una lambda che vuole collegarsi ad un server SFTP può recuperare password o chiave da SSM in maniera sicura.