CloudFormation !Join vs !Sub

Normalmente en la documentación de AWS encontramos JSON o YAML usando !Join de esta forma.

            Resource:
              - !Join
                - ''
                - - 'arn:aws:s3:::'
                  - !Ref RecordServiceS3Bucket

En este caso puede parece bastante sencillo (?) pero siempre es mucho mejor no hacer trabajar a nuestro pobre cerebro. Usando !Sub podemos tener un código más legible.

            Resource:
              - !Sub 'arn:aws:s3:::${RecordServiceS3Bucket}'

Es mucho más fácil leer una sola línea que cuatro.

Además parece ser que normalmente se usa !Join para poder usar !Ref y acceder a algún recurso lógico dentro del template. Pero no sería problema usar !Sub para el mismo fin, ya que, en la documentación nos explica que funciona de la siguiente manera:

!Sub sin mapping

The following example uses Fn::Sub with the AWS::Region and AWS::AccountId pseudo parameters and the vpc resource logical ID to create an Amazon Resource Name (ARN) for a VPC.

{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }

Dentro de esta línea !Sub puede acceder a la vez a pseudo parámetros de CloudFormation así como al ID del recurso lógico VPC. Sería lo mismo que hacemos en el primer ejemplo, referenciar un ID de recurso lógico de un bucket.

!Sub con mapping

Otro ejemplo de !Sub con mapping sería así:

Name: !Sub
  - www.${Domain}
  - { Domain: !Ref RootDomainName }

En resumen, siempre que podamos no usaremos !Join debido a que hace complicado el poder leer bien el código.

Links

Leave a Reply

Your email address will not be published. Required fields are marked *