如何使用 Boto3 在 Cloudformation 中为 API 网关获取预签名 url?
How do I get a pre-signed url for an API Gateway in Cloudformation using Boto3?
我想调用 Cloudformation 中维护的 API 网关。我有 Cloudformation 堆栈名称 (CF_STACK_NAME
)、API 网关资源名称 (API_GATEWAY_NAME
) 以及我需要承担的 IAM 角色的 Cloudformation 名称 (API_ROLE_NAME
)。
我可以通过
访问我的 Cloudformation 堆栈
cf_client = boto3.client('cloudformation')
api_role_resource = cf_client.describe_stack_resource(
StackName=CF_STACK_NAME,
LogicalResourceId=API_ROLE_NAME
)
api_resource = cf_client.describe_stack_resource(
StackName=CF_STACK_NAME,
LogicalResourceId=API_GATEWAY_NAME
)
通过阅读 Switching to an IAM Role,我了解了如何获取我的角色密钥,
sts_client = boto3.client('sts')
credentials = sts_client.assume_role(
RoleArn='arn:aws:iam::{account_id}:role/{role_name}'.format(
account_id=sts_client.get_caller_identity().get('Account'),
role_name=api_role_resource['PhysicalResourceId']
),
RoleSessionName="AssumeRoleSession1"
)['Credentials']
但是当我想调用 API url,
apigateway_client = boto3.client('apigateway')
restapi_id = apigateway_client.get_rest_api(restApiId=api_logical_id)['id']
url = f'https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage}/{api_query}
api_output = requests.get(url).json()
我明白了,
An error occurred (AccessDeniedException) when calling the GetRestApi operation: User: arn:aws:iam::0123456789:user/my-user is not authorized to perform: apigateway:GET on resource: arn:aws:apigateway:us-west-2::/restapis/ServerlessRestApi
如何使用此 CloudFormation 信息进行 API 调用?
我的猜测是您没有使用来自 STS 的新凭据。
您需要使用新凭据创建 apigateway 客户端,代码如下:
client = boto3.client(
'apigateway',
aws_access_key_id=credentials['Credentials']['AccessKeyId'],
aws_secret_access_key=credentials['Credentials']['SecretAccessKey'],
aws_session_token=credentials['Credentials']['SessionToken'])
我想调用 Cloudformation 中维护的 API 网关。我有 Cloudformation 堆栈名称 (CF_STACK_NAME
)、API 网关资源名称 (API_GATEWAY_NAME
) 以及我需要承担的 IAM 角色的 Cloudformation 名称 (API_ROLE_NAME
)。
我可以通过
访问我的 Cloudformation 堆栈cf_client = boto3.client('cloudformation')
api_role_resource = cf_client.describe_stack_resource(
StackName=CF_STACK_NAME,
LogicalResourceId=API_ROLE_NAME
)
api_resource = cf_client.describe_stack_resource(
StackName=CF_STACK_NAME,
LogicalResourceId=API_GATEWAY_NAME
)
通过阅读 Switching to an IAM Role,我了解了如何获取我的角色密钥,
sts_client = boto3.client('sts')
credentials = sts_client.assume_role(
RoleArn='arn:aws:iam::{account_id}:role/{role_name}'.format(
account_id=sts_client.get_caller_identity().get('Account'),
role_name=api_role_resource['PhysicalResourceId']
),
RoleSessionName="AssumeRoleSession1"
)['Credentials']
但是当我想调用 API url,
apigateway_client = boto3.client('apigateway')
restapi_id = apigateway_client.get_rest_api(restApiId=api_logical_id)['id']
url = f'https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage}/{api_query}
api_output = requests.get(url).json()
我明白了,
An error occurred (AccessDeniedException) when calling the GetRestApi operation: User: arn:aws:iam::0123456789:user/my-user is not authorized to perform: apigateway:GET on resource: arn:aws:apigateway:us-west-2::/restapis/ServerlessRestApi
如何使用此 CloudFormation 信息进行 API 调用?
我的猜测是您没有使用来自 STS 的新凭据。
您需要使用新凭据创建 apigateway 客户端,代码如下:
client = boto3.client(
'apigateway',
aws_access_key_id=credentials['Credentials']['AccessKeyId'],
aws_secret_access_key=credentials['Credentials']['SecretAccessKey'],
aws_session_token=credentials['Credentials']['SessionToken'])