Pubblicato il 04/11/2023 da alnao nella categoria AWS

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.

MENU