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 asumir un rol de AWS desde codebuild para actualizar una función lambda en otra cuenta de AWS?

Tengo codebuild en la cuenta A y el Buildspec contiene pasos para actualizar la función lambda que se encuentra en la cuenta B. Tenga en cuenta que S3 contiene un archivo zip y S3 está en la propia cuenta A.

El rol adjunto a codebuild es roleA.

Supongamos que tenemos 2 roles:
1. roleA en la cuenta A
2. roleB en la cuenta B

Política de confianza del rolA:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codebuild.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Políticas adjuntas al roleA:
– S3FullAccess
– CodebuildPolicy
– LambdaFullAccess
– CrossAccountPolicy

CrossAccountPolicy:

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::ACCOUNTID_B:role/roleB"
    }
}

Política de confianza del roleB:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ACCOUNTID_A:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

Política adjunta al roleB:
– AWSLambda_FullAccess

Cuando ejecuto codebuild, obtengo el siguiente error:

An error occurred (AccessDeniedException) when calling the UpdateFunctionCode operation: User: arn:aws:sts::ACCOUNTID_A:assumed-role/roleA/AWSCodeBuild-01f59836-f3e4-9732-d910-ff40967882f9 is not authorized to perform: lambda:UpdateFunctionCode on resource: arn:aws:lambda:us-west-1:ACCOUNTID_B:function:lambdafunctionhere because no resource-based policy allows the lambda:UpdateFunctionCode action

Archivo Buildspec:

version: 0.2

phases:
  build:
    commands:
       - aws --version
       - aws lambda update-function-code --function-name arn:aws:lambda:us-west-1:ACCOUNTID_B:function:lambdafunctionnamehere --s3-bucket s3zip_accountA --s3-key Lambda/package.zip
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el rolA asumido por codebuild no tiene permisos para actualizar la función lambda ubicada en la cuenta B. Esto se debe a que la función lambda tiene una política basada en recursos que restringe las acciones que se pueden realizar sobre ella.

    Para resolver este problema, debes agregar una declaración de política a la política basada en recursos de la función lambda que permita al rolA en la cuenta A actualizar el código de la función. Puedes hacer esto agregando la siguiente declaración de política a la política basada en recursos de la función lambda:

    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::ACCOUNTID_A:role/roleA"
        },
        "Action": "lambda:UpdateFunctionCode",
        "Resource": "arn:aws:lambda:us-west-1:ACCOUNTID_B:function:lambdafunctionnamehere"
    }
    

    Esta declaración de política permite que el rolA en la cuenta A realice la acción UpdateFunctionCode en la función lambda especificada en la cuenta B.

    Alternativamente, también puedes modificar la política de relación de confianza de rolB en la cuenta B para permitir que el rol asumido de rolA en la cuenta A asuma el rolB. Para hacer esto, puedes agregar la siguiente declaración a la política de relación de confianza de rolB en la cuenta B:

    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ACCOUNTID_A:role/roleA"
      },
      "Action": "sts:AssumeRole"
    }
    

    Esto permite que el rol asumido de rolA en la cuenta A asuma el rolB en la cuenta B, que debería tener permisos para actualizar el código de la función lambda en la cuenta B.

    Cualquiera de estas soluciones debería resolver el error de AccessDeniedException que estás experimentando al ejecutar codebuild.

Comments are closed.