AWS Serverless IdentityPoolRoleAttachment - PullRequest
0 голосов
/ 07 июня 2018

Итак, я создаю роль, чтобы мои пользователи Cognito могли вызывать API Gateway:

    IdentityAuthenticatedRole:
      Type: AWS::IAM::Role
      Properties:
        AssumeRolePolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Principal:
                Federated: "cognito-identity.amazonaws.com"
              Action:
                - "sts:AssumeRoleWithWebIdentity"
              Condition:
                StringEquals: 
                  "cognito-identity.amazonaws.com:aud":
                    - Ref: CognitoIdentityPoolStandardUserIdentityPool
                ForAnyValue:StringLike:
                  "cognito-identity.amazonaws.com:amr": authenticated
        Policies:
          - PolicyName: CognitoGatewayExecute
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - "execute-api:Invoke"
                  Resource: "arn:aws:execute-api:*:*:*"
        MaxSessionDuration: 3600

Затем я присоединяю роль к своему IdentityPoolRoleAttachment:

CognitoIdentityPoolRoleAttachment:
  DependsOn: CognitoIdentityPoolStandardUserIdentityPool
  Type: AWS::Cognito::IdentityPoolRoleAttachment
  Properties:
    IdentityPoolId:
      Fn::Join:
        - ''
        - - Ref: CognitoIdentityPoolStandardUserIdentityPool
          - ''
    Roles:
      authenticated:
        Fn:GetAtt
          - IdentityAuthenticatedRole
          - Arn

Согласно документам, это должно работать, но, конечно, это не так:

CognitoIdentityPoolRoleAttachment - Access to Role 'Fn:GetAtt - IdentityAuthenticatedRole - Arn' is forbidden.

Может кто-нибудь пролить свет на это?

PS Как я уже вставил этот фрагмент, есть еще одна вещь: я использую Fn :: Join, потому что в противном случае меня встречают с ошибкой «Не типа String», есть ли лучший способ справиться с этим?

1 Ответ

0 голосов
/ 09 июня 2018

Синтаксическая ошибка

Ваш синтаксис Fn::GetAtt немного отклонен.Вам нужно два двоеточия между Fn и GetAtt, а затем вам нужно двоеточие в конце этой строки.Например:

      authenticated:
        Fn::GetAtt:

Это исправит странное сообщение об ошибке, содержащее Fn:GetAtt ... где должно быть реальное имя роли.

Fn :: Join

Вы можете избавиться от вызова Fn::Join, просто используя Ref, например, так:

  Properties:
    IdentityPoolId: 
      Ref: CognitoIdentityPoolStandardUserIdentityPool

Зависит от

The DependsOn строка в порядке, но не нужна.CloudFormation достаточно умен, чтобы выяснить эту зависимость для вас.

YAML note

Наконец, хотя это сводится к предпочтению читабельности, я обычно помещаю короткие списки (например,те, которые вы передаете Fn::GetAtt) в квадратных скобках.Таким образом, вы можете заменить это:

  authenticated:
    Fn::GetAtt:
      - IdentityAuthenticatedRole
      - Arn

на это:

      authenticated:
        Fn::GetAtt: [IdentityAuthenticatedRole, Arn]

Перезаписано

Результат короче, и, возможно, легче читать,Объединение этих предложений приводит к получению ресурса роли:

CognitoIdentityPoolRoleAttachment:
  Type: AWS::Cognito::IdentityPoolRoleAttachment
  Properties:
    IdentityPoolId: 
      Ref: CognitoIdentityPoolStandardUserIdentityPool
    Roles:
      authenticated:
        Fn::GetAtt: [IdentityAuthenticatedRole, Arn]

Протестировано с использованием Без сервера 1.27.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...