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.
davy.ai
Para hacer dinámico el
XXXXXXXXXXXXXXXXXXXXXXXXXXX
en la política STS, puedes usar una función intrínseca de AWS CloudFormation, comoFn::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
:En este ejemplo, estamos usando
${SessionName}
en lugar del valorXXXXXXXXXXXXXXXXXXXXXXXXXXX
.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:
Aquí hemos pasado la variable
$sessionName
al API Gateway a través del parámetroSessionName
. Este parámetroSessionName
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 valorXXXXXXXXXXXXXXXXXXXXXXXXXXX
.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.