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.

Aws STS asumir rol para llamar a API Gateway.

Estoy tratando de llamar a una ruta de api gateway utilizando StsClient assumeRole (php aws sdk 3). Todo funciona bien, excepto que no sé cómo no ‘hardcodear’ el ARN de sesión del usuario sts en la política de roles.
Aquí está mi código para el serverless:

Resources:
  ApiGatewayPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: my-policy-apigateway
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action:
              - execute-api:Invoke
            Resource:
              Fn::Join: [ "", [ "arn:aws:execute-api:", { "Ref": "AWS::Region" }, ':', { "Ref": "AWS::AccountId" }, ':', { "Ref": "ApiGatewayRestApi" }, '/*/GET/routeName/*/*/*' ] ]
            Effect: Allow
      Roles:
        - Ref: IamRoleApiGatewayExecution

Y la política de STS (con STS y no con el ARN del usuario IAM):

Resources:
  IamRoleApiGatewayExecution:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              AWS:
                Fn::Join: [ "", [ "arn:aws:sts::", { "Ref": "AWS::AccountId" }, ':assumed-role/YYYYYYYYYYYYY/XXXXXXXXXXXXXXXXXXXXXXXXXXX' ] ]
            Action: sts:AssumeRole

Llamo a la ruta con php sdk de aws (otro proyecto):

$stsClient = new StsClient([
    'region' => 'eu-west-1',
    'version' => 'latest',
]);
$ARN = "arn:aws:iam::.........:role/dating-crop-dev-IamRoleApiGatewayExecution-..........";

$sessionName = uniqid('api-gateway-access-');
$result = $stsClient->assumeRole([
    'RoleArn' => $ARN,
    'RoleSessionName' => $sessionName,
]);

Y como dije, todo funciona bien, excepto que no sé cómo hacer que el XXXXXXXXXXXXXXXXXXXXXXX sea dinámico, de lo contrario, tengo que actualizarlo después de algunas horas (práctica poco recomendable :)).
Gracias por cualquier sugerencia.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer dinámico el XXXXXXXXXXXXXXXXXXXXXXXXXXX en la política STS, puedes usar una función intrínseca de AWS CloudFormation, como Fn::Sub, para sustituir el valor por una referencia dinámica.

    Aquí tienes un ejemplo de cómo puedes modificar la política STS para usar Fn::Sub:

    Resources:
      IamRoleApiGatewayExecution:
        Type: 'AWS::IAM::Role'
        Properties:
          AssumeRolePolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Principal:
                  AWS:
                    Fn::Join: [ "", [ "arn:aws:sts::", { "Ref": "AWS::AccountId" }, ":assumed-role/YYYYYYYYYYYYY/${SessionName}" ] ]
                Action: sts:AssumeRole
    

    En este ejemplo, estamos usando ${SessionName} en lugar del valor XXXXXXXXXXXXXXXXXXXXXXXXXXX. SessionName es una variable que definimos en nuestro código PHP.

    Aquí tienes un ejemplo de cómo modificar el código PHP para usar este valor dinámico:

    $stsClient = new StsClient([
        'region' => 'eu-west-1',
        'version' => 'latest',
    ]);
    $ARN = "arn:aws:iam::.........:role/dating-crop-dev-IamRoleApiGatewayExecution-..........";
    $sessionName = uniqid('api-gateway-access-');
    $result = $stsClient->assumeRole([
        'RoleArn' => $ARN,
        'RoleSessionName' => $sessionName,
    ]);
    $route = "https://<api_gateway_id>.execute-api.<region>.amazonaws.com/<stage>/routeName";
    $accessKeyId = $result['Credentials']['AccessKeyId'];
    $secretAccessKey = $result['Credentials']['SecretAccessKey'];
    $sessionToken = $result['Credentials']['SessionToken'];
    $client = new ApiGatewayManagementApiClient([
        'endpoint' => $route,
        'accessKeyId' => $accessKeyId,
        'secretAccessKey' => $secretAccessKey,
        'sessionToken' => $sessionToken,
    ]);
    $response = $client->postToConnection([
        'ConnectionId' => $connectionId,
        'Data' => $data,
        'SessionName' => $sessionName,
    ]);
    

    Aquí hemos pasado la variable $sessionName al API Gateway a través del parámetro SessionName. Este parámetro SessionName se puede acceder en la política STS a través de la variable ${SessionName}, lo que nos permite usar una referencia dinámica para el valor XXXXXXXXXXXXXXXXXXXXXXXXXXX.

    Al utilizar este enfoque, ya no será necesario codificar el ARN de la sesión en la política de roles y podrás evitar tener que actualizarlo periódicamente.

Comments are closed.