Cloudformation posso criar uma nova função referenciando uma política existente?

10

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

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

Na formação da nuvem, é 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 fazer referência a ela, mas estou um pouco preso.

hughmcmanus
fonte
A mesma solução provavelmente poderia ser concluída adicionando várias funções aos perfis de instância, mas pelo que li, há uma limitação de que você pode especificar apenas uma função por perfil de instância.
Hjmcmanus

Respostas:

12

src: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html

Os AWS::IAM::Roletipos agora têm um ManagedPolicyArnscampo onde você pode definir isso. Você só precisa pegar o ARN (fácil de pegar no console do 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 do 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
John Eikenberry
fonte
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 anexe-a a cada função em que deseja usá-la. Quaisquer alterações futuras em sua política gerenciada serão aplicadas imediatamente a todas as funções que têm a política gerenciada anexada.

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

markusk
fonte
3
Você pode mostrar como no Cloudformation?
lony
1

Para expandir a resposta de @ markusk, re: 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": [
        ...
      ]
    }
  }
}
Peter Mounce
fonte
-1

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

  • Crie um novo perfil de instância com AWS :: IAM :: InstanceProfile e atribua a função genérica 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 a nova função a um novo recurso AWS :: IAM :: InstanceProfile em seu modelo e usá-lo para suas instâncias do EC2 ou iniciar configurações.
dialt0ne
fonte
Acabei fazendo algo parecido com a sua segunda sugestão. Mudei as políticas na função genérica para o modelo de formação em nuvem e as adicionei à nova função, se necessário.
Hjmcmanus
Embora essa resposta esteja correta quando escrita, ela é mais longa, pois a AWS introduziu políticas gerenciadas desde então, permitindo a reutilização de políticas.
markusk