es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir una política basada en recursos en CloudFormation

Quiero invocar una Lambda desde una cuenta de AWS externa, y logré hacerlo creando una declaración de política en la pestaña de política basada en recursos de la consola (Lambda > Configuración > Permisos > Política basada en recursos). Sin embargo, no encuentro una forma de escribir una política como esta en mi plantilla de CloudFormation. Esto es lo que escribí:

InvokePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: 'InvokeLambdaFromGateway'
      Roles:
        - !Sub "arn:aws:iam::${AWS::AccountId}:role/NameOfLambda"
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Sid: InvokeLambdaExternally
            Effect: Allow
            Resource:
              - !Ref NameOfLambda
            Action:
              - lambda:InvokeFunction
            Principal:
              AWS: ["arn:aws:iam::AccountIUseToInvokeTheLambda:root"]

Pero recibo este error: “La declaración de política de recursos IAM no debe tener Principal o NotPrincipal”.

¿Cómo puedo adjuntar esa política a mi Lambda con una definición de Principal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Al utilizar CloudFormation para crear una declaración de política para políticas basadas en recursos, no se debe incluir una definición de Principal o NotPrincipal. En su lugar, use la propiedad de Recurso para definir el ARN del recurso al que se aplica la política y use la propiedad de Condición para especificar la cuenta autorizada para invocar la función Lambda. Aquí hay un ejemplo:

    InvokePolicy:
      Type: AWS::Lambda::Permission
      Properties:
        Action: 'lambda:InvokeFunction'
        FunctionName: !Ref NameOfLambda
        Principal: 'sns.amazonaws.com'
        SourceAccount:
          Fn::ImportValue:
            !Sub '${OtherAccount}-AccountId'
    

    En este ejemplo, la declaración de política permite que un tema de Amazon SNS en la otra cuenta de AWS (especificada por el parámetro OtherAccount) invoque la función Lambda. La función Fn::ImportValue recupera el ID de la cuenta de la otra cuenta desde una exportación de CloudFormation. Tenga en cuenta que la propiedad Principal sigue siendo requerida, pero su valor se establece en el principal de servicio que representa la cuenta externa (en este caso, sns.amazonaws.com).

Comments are closed.