Как использовать псевдопараметры в aws cdk?

Привет, я работаю над AWS CDK на Python. Я создаю программный документ. Раньше я писал шаблон формирования облака для той же политики, и он работал нормально. Ниже приведена политика формирования облака.

MWSECSServiceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: [ecs.amazonaws.com]
            Action: ['sts:AssumeRole']
      Path: /
      Policies:
        - PolicyName: "ecs-service-role"
          PolicyDocument:
            Statement:
              - Effect: Allow
                Action:
                  - elasticloadbalancing:DeregisterInstancesFromLoadBalancer
                  - elasticloadbalancing:DeregisterTargets
                  - elasticloadbalancing:RegisterInstancesWithLoadBalancer
                  - elasticloadbalancing:RegisterTargets
                # yamllint disable-line rule:line-length
                Resource:
                  # yamllint disable-line rule:line-length
                  - !Sub 'arn:aws:elasticloadbalancing:*:${AWS::AccountId}:loadbalancer/app/mws-*'
                  # yamllint disable-line rule:line-length
                  - !Sub 'arn:aws:elasticloadbalancing:*:${AWS::AccountId}:listener-rule/app/mws-*'
                  # yamllint disable-line rule:line-length
                  - !Sub 'arn:aws:elasticloadbalancing:*:${AWS::AccountId}:listener/app/mws-*'
                  # yamllint disable-line rule:line-length
                  - !Sub 'arn:aws:elasticloadbalancing:*:${AWS::AccountId}:targetgroup/mws-*'

              - Effect: Allow
                Action:
                  - ec2:Describe*
                  - ec2:AuthorizeSecurityGroupIngress
                  - elasticloadbalancing:Describe*
                Resource: '*'

Теперь я пишу AWS CDK, как показано ниже.

 MWSECSServiceRole = iam.Role(self, 'MWSECSServiceRole',
          assumed_by=new ServicePrincipal('ecs.amazonaws.com'))

        MWSECSServiceRole.add_to_policy(iam.PolicyStatement(
        effect=iam.Effect.ALLOW,
        resources=["arn:aws:elasticloadbalancing:*:${AWS::AccountId}:loadbalancer/app/mws-*","arn:aws:elasticloadbalancing:*:${AWS::AccountId}:listener-rule/app/mws-*","arn:aws:elasticloadbalancing:*:${AWS::AccountId}:listener/app/mws-*","arn:aws:elasticloadbalancing:*:${AWS::AccountId}:targetgroup/mws-*"],
        actions=["elasticloadbalancing:DeregisterInstancesFromLoadBalancer","elasticloadbalancing:DeregisterTargets","elasticloadbalancing:RegisterInstancesWithLoadBalancer","elasticloadbalancing:RegisterTargets"]
        ))

        MWSECSServiceRole.add_to_policy(iam.PolicyStatement(
        effect=iam.Effect.ALLOW,
        resources=["*"],
        actions=["ec2:AuthorizeSecurityGroupIngress","ec2:Describe*","elasticloadbalancing:Describe*"]
        ))

Это сгенерирует ресурсы, например arn:aws:elasticloadbalancing:*:${AWS::AccountId}:loadbalancer/app/mws-*, но мне нужно - !Sub 'arn:aws:elasticloadbalancing:*:${AWS::AccountId}:loadbalancer/app/mws-*'. Итак, как использовать! Sub в AWS CDK? Может ли кто-нибудь мне в этом помочь?


person Niranjan    schedule 10.12.2019    source источник
comment
Не знаком с CDK, но нашел это в документации. Помогает? docs.aws.amazon.com/cdk/ api / latest / python / aws_cdk.core / Aws.html Похоже, вы можете получить идентификатор учетной записи оттуда. Затем вы замените его в строке стандартной интерполяцией строки Python   -  person adamkgray    schedule 10.12.2019
comment
См. stackoverflow.com/questions/59261713/   -  person jogold    schedule 10.12.2019


Ответы (1)


Итак, я только недавно начал использовать AWS CDK с Python. Думал, что отвечу, если это поможет кому-то другому

Мы переносим существующие шаблоны cfn с помощью CDK и хотим использовать абстракцию кода и параметры подачи для создания шаблонов cfn.

Я столкнулся с той же проблемой и сделал следующее:

ядро импорта:

from aws_cdk import (
    core
)

вне вашего класса CDK объявите объект функции CDK:

Fn = core.Fn

Внутри вашего класса CDK создайте функцию, похожую на:

def checkFnSubRequired(self, content):
    if re.search(r'\${.*}', content):
        return Fn.sub(content)
    else:
        return content

Функция позволяет вам взять любую строку, которая может потребовать замены, и вернуть замененный объект, например:

resources=["arn:aws:elasticloadbalancing:*:${AWS::AccountId}"]

изменяется на следующее:

resources=[self.checkFnSubRequired("arn:aws:elasticloadbalancing:*:${AWS::AccountId}")]
person Abdul Baki    schedule 02.11.2020