web-dev-qa-db-ja.com

Cloudformation YAMLでは、複数行の文字列でRefを使用します(?use Fn:Sub)

次のようなawsリソースがあるとします

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

「AWS :: Cognito :: IdentityPool」のRefは、このリソースのIDを返します。ここで、複数行の文字列でそのIDを参照したいとしましょう。私はもう試した

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',
      }

また、Fn:Subを使用しようとしましたが、運はありません。

   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

これを行う方法はありますか?

8
honkskillet

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}"

これは機能しますが、ちょっといです。 Fn :: Subでこれを行う方法を誰かが示すことができるかどうかを確認するために、この回答をしばらく受け入れないままにします。

4
honkskillet

YAMLでパイプシンボル|を使用すると、次のすべてのインデントされた行が複数行の文字列に変換されます。

!Subと組み合わせたパイプを使用すると、次のことができます。

  • リソースRef${YourResource}のような値を簡単に返します
  • Fn::GetAttはピリオドだけで値を返します${YourResource.TheAttribute}
  • ${AWS:region}のような擬似パラメーター

!Sub |と同じくらい簡単で、次の行にジャンプして適切なインデントを追加します。例:

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}',
      }
21
Clorichel

YAMLを使用すると、これを簡単に構成できます。

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