Cloudformation posso criar uma nova função fazendo referência a uma política existente?

7

No momento, tenho um bucket S3 compartilhado que tem acesso específico a determinados caminhos de chave (ou seja, pastas) para instâncias diferentes. Consegui criar um perfil de instância com minha nova função e testar sem problemas ao limitar o acesso a essa pasta.

Meu problema é que existe uma função genérica existente com políticas definidas, que também quero incluir em minha nova função para cada pilha.

Em cloudformation, é possível incluir políticas definidas em uma função para serem incluídas em outra função sem precisar redefinir o documento de política na nova função?

Algo como o seguinte:

"AppTierS3AccessRole": {
        "Type": "AWS::IAM::Role",
        "Properties": {
            "AssumeRolePolicyDocument": {
                "Statement": [
                    {
                        "Effect": "Allow",
                        "Principal": {
                            "Service": [ "ec2.amazonaws.com" ]
                        },
                        "Action": [ "sts:AssumeRole" ]
                    }
                ]
            },
            "Path": "/",
            "Policies": [ { "Ref": "existing-policy" } ]
        }
    },

A "política existente" é a parte importante aqui. Eu tentei encontrar o arn da política existente para tentar referenciá-lo, mas estou um pouco preso.

    
por hughmcmanus 03.07.2014 / 02:44

4 respostas

8

src: link

Os tipos "AWS :: IAM :: Role" agora têm um campo "ManagedPolicyArns" onde você pode definir isso. Você só precisa pegar o ARN (fácil de pegar do console IAM) e colocá-lo nesse campo. No exemplo abaixo, criei uma função que fornece acesso ECR somente leitura, para que minha imagem possa extrair contêineres docker do ECR.

  ecrRole:
    Type: AWS::IAM::Role
    Properties:
      Path: "/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
    
por 28.04.2017 / 02:28
4

Você pode conseguir isso usando políticas gerenciadas . Coloque a política definida que você deseja compartilhar em uma política gerenciada pelo cliente e, em seguida, anexe essa política definida a cada função em que você deseja usá-la. Quaisquer alterações futuras na política gerenciada serão imediatamente aplicadas a todas as funções associadas à política gerenciada.

Você pode criar a política gerenciada pelo cliente no CloudFormation, por meio de um AWS :: IAM :: ManagedPolicy ou anexar uma política gerenciada existente.

    
por 02.10.2015 / 07:48
1

Para expandir a resposta de @ markusk, consulte: Políticas gerenciadas - sim, isso.

Exemplo:

"ManagedPolicy": {
  "Type": "AWS::IAM::ManagedPolicy",
  "Properties": {
    "Description": "something descriptive",
    "Groups": [ ... ref(s) for groups ... ],
    "Roles: [{"Ref":"AppTierS3AccessRole"}],
    "Users": [ ... ref(s) for users ... ],
    "PolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        ...
      ]
    }
  }
}
    
por 31.03.2016 / 02:25
-1

Não, você não pode incorporar uma função em outra função no momento. As únicas alternativas que consigo pensar são:

  • Crie um novo perfil de instância com AWS :: IAM :: InstanceProfile e atribuir o papel genérico existente a ele.
  • Antes de criar sua pilha do CloudFormation, execute um script que duplique a função genérica. por exemplo. Ele cria uma nova função, lista todas as políticas para a função genérica existente e as recria na nova função. Em seguida, você pode atribuir o novo papel a um novo AWS :: IAM: : InstanceProfile no seu modelo e usá-lo para suas instâncias do EC2 ou configurações de inicialização.
por 08.07.2014 / 23:07