使用AWS SAM部署Lambda遇policyArn长度校验错误如何解决?
使用AWS SAM通过CloudFormation部署Lambda,该Lambda调用StartInstancesCommand、StopInstancesCommand和DescribeInstancesCommand API实现EC2实例定时启停。执行sam deploy时,使用EC2DescribePolicy或EC2FullAccessPolicy SAM策略模板遇到以下错误:
1 validation error detected: Value 'EC2DescribePolicy' at 'policyArn' failed to satisfy constraint: Member must have length greater than or equal to 20 (Service: AmazonIdentityManagement; Status Code: 400; Error Code: ValidationError;
相关template.yaml配置:
AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Description: > test-function Resources: TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: test-function/ Handler: app.lambdaHandler Runtime: nodejs16.x MemorySize: 512 Timeout: 60 Policies: - AWSLambdaBasicExecutionRole - AWSLambdaVPCAccessExecutionRole - EC2DescribePolicy Architectures: - x86_64 Events: ScheduledEvent: Type: Schedule Properties: Schedule: cron(0 8 * * ? *) Enabled: True
环境版本信息:
$ sam --version SAM CLI, version 1.60.0 $ node --version v16.17.0 $ docker --version Docker version 20.10.17, build 100c701 $ python3 --version Python 3.9.6
错误原因
EC2DescribePolicy和EC2FullAccessPolicy并非SAM官方预定义的策略模板名称,SAM无法识别这些名称,会错误地将其当作IAM策略ARN处理,而这些字符串长度远小于ARN要求的最小20字符,因此触发验证错误。
修复方法
有两种可选修复方式:
方式1:使用SAM官方预定义的EC2策略模板
SAM提供了合规的EC2相关策略模板,比如:
AWSEC2StartStopPolicy:包含StartInstances、StopInstances和DescribeInstances权限,刚好匹配你的需求AmazonEC2FullAccess:对应EC2全权限AmazonEC2ReadOnlyAccess:对应EC2只读权限(包含DescribeInstances操作)
修改后的Policies配置示例:
Policies: - AWSLambdaBasicExecutionRole - AWSLambdaVPCAccessExecutionRole - AWSEC2StartStopPolicy
方式2:自定义内联策略
如果需要更精细的权限控制,可以直接定义内联策略,仅授予Lambda所需的EC2操作权限:
Policies: - AWSLambdaBasicExecutionRole - AWSLambdaVPCAccessExecutionRole - Version: '2012-10-17' Statement: - Effect: Allow Action: - ec2:StartInstances - ec2:StopInstances - ec2:DescribeInstances Resource: '*' # 可指定具体EC2实例ARN缩小权限范围
是否必须手动指定policyArn?
不需要。只要使用SAM官方预定义的策略模板名称(如上述AWSEC2StartStopPolicy),SAM会自动关联对应的IAM策略ARN,无需手动填写。只有引用自定义IAM策略或AWS托管策略的ARN时,才需要手动指定完整ARN。
内容的提问来源于stack exchange,提问作者glcheetham

