AWS Сбой модели SAM при создании API с пользовательским доменным именем с использованием зоны, размещенной в нескольких учетных записях - PullRequest
0 голосов
/ 29 марта 2020

Постановка проблемы

Мое доменное имя R53 и размещенная зона находятся в учетной записи A. Я хочу создать API для учетной записи B (модель Thru SAM), в которой будет иметься собственное доменное имя, объявленное в учетной записи A.

Вот мой пример шаблона SAM

AWSTemplateFormatVersion : '2010-09-09'
Globals:
  Api:
    OpenApiVersion: 3.0.1
Transform: AWS::Serverless-2016-10-31
Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      Domain:
        CertificateArn: pCertificateArn
        BasePath:
          - pVersion
        DomainName: pCustomDomainName
        Route53:
          HostedZoneId: pHostedZoneId
      EndpointConfiguration: REGIONAL
      StageName: pStageName
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri:
      Handler: hello.lambdaHandler
      Runtime: nodejs12.x
      Events:
        AuthApi:
          Type: Api
          Properties:
            Path: /hello-main
            Method: GET
            RestApiId: !Ref ApiGatewayApi

Я выполняю этот шаблон SAM через конвейер, здесь приведен код роли развертывания конвейера. Это будет выполнено в учетной записи B

 rDeployProjectRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub '${AWS::StackName}-DEPLOYPROJECT-ROLE-${pEnv}'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service: 
              - cloudformation.amazonaws.com
          Action: sts:AssumeRole
      Policies:
      - PolicyName: !Sub '${AWS::StackName}-DEPLOYPROJECT-POLICY-${pEnv}'
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
<highlighting only the necessary assumed role>
            - Effect: Allow
              Action:
                - sts:AssumeRole
              Resource: !Ref pRoute53AssumedRoleArn  

Теперь в моей учетной записи A я создал роль для предоставления доступа к учетной записи B следующим образом:

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  CreateRoute53Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal: 
              AWS:
                - arn:aws:iam::<Account B>:root
            Action:
              - sts:AssumeRole
      Path: "/"
      Policies:
        - PolicyName: Route53Access
          PolicyDocument:
            Version: 2012-10-17
            Statement:
            - Effect: Allow
              Action:
                - route53:*
              Resource: 
                - arn:aws:route53:::hostedzone/XXX

Каждый раз, когда я запускаю вышеуказанное код, он терпит неудачу с этой ошибкой в ​​стеке cfn -

API: route53:GetHostedZone User: arn:aws:sts::XXX:assumed-role/XXX-DEPLOYPROJECT-ROLE-dev/AWSCloudFormation is not authorized to access this resource

Интересно, когда я смотрю роль (XXX-DEPLOYPROJECT-ROLE-dev) в IAM и смотрю на советник по доступу, он говорит, что мой pRoute53AssumedRoleArn даже не доступен. Я не уверен, что я делаю не так.

Кроме того, если бы я создал свой API через шаблон SAM в учетной записи A, он был бы создан совершенно нормально, с пользовательским доменным именем, именно так, как я этого хотел.

Кажется проблематичным c только с доступом к доменному имени для нескольких учетных записей.

...