web-dev-qa-db-fra.com

Dans Cloudformation YAML, utilisez une référence dans une chaîne multiligne (? Utilisez Fn: Sub)

Imaginez que vous ayez une ressource aws telle que

  Resources:
    IdentityPool:
      Type: "AWS::Cognito::IdentityPool"
      Properties:
        IdentityPoolName: ${self:custom.appName}_${self:provider.stage}_identity
        CognitoIdentityProviders:
          - ClientId:
              Ref: UserPoolClient

La référence de "AWS :: Cognito :: IdentityPool" renvoie l'identifiant de cette ressource. Maintenant, disons que je veux référencer cet identifiant dans une chaîne multiligne. J'ai essayé

Outputs:  
  AmplifyConfig:
    Description: key/values to be passed to Amplify.configure(config);
    Value: |
      {
        'aws_cognito_identity_pool_id': ${Ref: IdentityPool}, ##<------ Error
        'aws_sign_in_enabled': 'enable',
        'aws_user_pools_mfa_type': 'OFF',
      }

J'ai aussi essayé d'utiliser Fn: Sub mais sans chance. 

   AmplifyConfig:
      Description: key/values to be passed to Amplify.configure(config);
      Value: 
        Fn::Sub 
          - |
            {
              'aws_cognito_identity_pool_id': '${Var1Name}',
              'aws_sign_in_enabled': 'enable',
            }
          - Var1Name:
              Ref: IdentityPool

Une façon de faire ça?

5
honkskillet

J'ai découvert comment faire cela en utilisant Join

AmplifyConfig:
  Description: key/values to be passed to Amplify.configure(config);
  Value:
    Fn::Join:
      - ''
      - - "{"
        - "\n  'aws_cognito_identity_pool_id':"
        - Ref : IdentityPool
        - "\n  'aws_user_pools_id':"
        - Ref : UserPool
        - "\n  'aws_user_pools_web_client_id':"
        - Ref : UserPoolClient
        - ",\n  'aws_cognito_region': '${self:provider.region}'"
        - ",\n  'aws_sign_in_enabled': 'enable'"
        - ",\n  'aws_user_pools': 'enable'"
        - ",\n  'aws_user_pools_mfa_type': 'OFF'"
        - "\n}"

Cela fonctionne mais c'est un peu moche. Je vais laisser cette réponse inacceptable pendant un moment pour voir si quelqu'un peut montrer comment faire cela avec Fn :: Sub.

3
honkskillet

L'utilisation d'un symbole de canal | dans YAML transforme toutes les lignes en retrait suivantes en une chaîne multiligne.

Un tuyau, combiné avec !Sub vous permettra d'utiliser:

  • vos ressources Ref renvoient facilement la valeur telle que ${YourResource}
  • leurs Fn::GetAtt renvoient des valeurs avec seulement un point ${YourResource.TheAttribute}
  • n'importe quel pseudo-paramètre tel que ${AWS:region}

Aussi simple que !Sub |, sautez à la ligne suivante et ajoutez le retrait approprié. Exemple:

Resources:
  YourUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: blabla

Outputs:
  AmplifyConfig:
    Description: key/values to be passed to Amplify.configure(config);
    Value: !Sub |
      {
        'aws_cognito_identity_pool_id': '${YourUserPool}',
        'aws_sign_in_enabled': 'enable',
        'aws_user_pools_mfa_type': 'OFF',
      }
  AdvancedUsage:
    Description: use Pseudo Parameters and/or resources attributes
    Value: !Sub |
      {
        'aws_region': '${AWS::Region}',
        'user_pool_arn': '${YourUserPool.Arn}',
      }
12
Clorichel

En utilisant YAML, vous pouvez composer ceci simplement:

Outputs:  
  AmplifyConfig:
    Description: key/values to be passed to Amplify.configure(config);
    Value: !Sub '
      {
        "aws_cognito_identity_pool_id": "${IdentityPool}",
        "aws_sign_in_enabled": "enable",
        "aws_user_pools_mfa_type": "OFF",
      }'
1
Chad Elias