Step Functions调用API Gateway时的API Key相关问题咨询
需求1:同账号内无需API Key,通过资源策略让Step Function调用接口
可以实现,通过配置API Gateway的资源策略,允许Step Function的执行角色直接访问目标API资源,无需携带API Key。具体操作如下:
编写API Gateway资源策略:
在API Gateway的资源策略中添加两条语句:一条允许指定的Step Function执行角色调用getOrders资源;另一条保留原有的API Key验证逻辑,确保其他请求仍需API Key。示例策略如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:role/你的StepFunction执行角色ARN" }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/你的阶段/GET/getOrders/*" }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/你的阶段/GET/getOrders/*", "Condition": { "ApiKeyExists": "true" } } ] }调整Step Function任务配置:
保持原任务的AuthType: "IAM_ROLE"配置,同时移除Headers中的x-api-key字段,因为资源策略已允许执行角色直接访问。确保执行角色权限:
给Step Function的执行角色添加execute-api:Invoke权限,允许其调用目标API资源。
需求2:Step Function任务直接获取API Key的值
AWS不提供原生的Step Function内置任务直接获取API Key的明文值——因为API Key创建后,AWS不会存储其明文,仅能在创建时获取并自行保存。
如果不想用Lambda,可以通过Step Function的AWS SDK集成任务,从Secrets Manager或Systems Manager Parameter Store中读取预先存储的API Key:
- 使用
arn:aws:states:::aws-sdk:secretsmanager:getSecretValue任务读取Secrets Manager中的密钥 - 使用
arn:aws:states:::aws-sdk:ssm:getParameter任务读取Parameter Store中的参数
示例Step Function任务配置(读取Secrets Manager):
{ "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:secretsmanager:getSecretValue", "Parameters": { "SecretId": "你的API Key存储的Secret名称" }, "ResultPath": "$.ApiKey", "Next": "调用API Gateway的任务" }
需求3:为getOrders资源单独配置专属API Key
可以通过API Gateway的Usage Plan实现资源级别的API Key隔离,步骤如下:
创建新的API Key:
在API Gateway控制台中创建第二个API Key,用于单独访问getOrders资源。创建专属Usage Plan:
创建一个新的Usage Plan,仅关联getOrders资源:- 在Usage Plan的"API Stages"配置中,选择你的API和阶段,然后添加
GET /getOrders/{CustomerID}路径(精确匹配该资源)。
- 在Usage Plan的"API Stages"配置中,选择你的API和阶段,然后添加
关联API Key与Usage Plan:
将新创建的API Key关联到这个专属Usage Plan;原有的API Key继续关联到包含所有5个资源的旧Usage Plan。验证资源权限:
确保getOrders资源已启用"API Key Required"配置,此时:- 旧API Key可访问所有5个资源
- 新API Key仅能访问
getOrders资源
内容的提问来源于stack exchange,提问作者DBtake3

