CloudFormation中使用!ImportValue导入角色ARN的正确方法
解决CloudFormation跨栈导入IAM角色ARN的问题
你的错误有两个核心原因,修正后就能正常导入:
1. YAML语法错误
你在栈2里写的Role: !ImportValue: LocalLambdaExecRole.Arn不符合CloudFormation的YAML语法规范。短格式函数!ImportValue后面不能跟冒号,正确写法是直接将导入名称放在函数后(名称含特殊字符时用引号包裹)。
2. 导入名称不匹配
栈1的导出名称是!Sub "${AWS::StackName}-LocalLambdaExecRole",而非LocalLambdaExecRole.Arn。另外,栈1中!Ref LocalLambdaExecRole返回的就是IAM角色的ARN,无需额外添加.Arn后缀。
修正后的栈2配置
Resources: LogGroup: Type: "AWS::Logs::LogGroup" Properties: LogGroupName: "TestGroup" HtmlRendererFunction: Type: AWS::Lambda::Function Properties: FunctionName: "TestLambda" # 替换为栈1实际的栈名称,例如栈1名为MyStack则写MyStack-LocalLambdaExecRole Role: !ImportValue "MyStack-LocalLambdaExecRole" Runtime: python3.9 Architectures: - arm64 Handler: app.handler Timeout: 40 MemorySize: 8000 PackageType: Image Code: ImageUri: "123.dkr.ecr.eu-west-1.amazonaws.com/test:latest" VpcConfig: SecurityGroupIds: - sg-0e640b53f5ba70c4e SubnetIds: - subnet-037112f9a752f20c8 - subnet-0abd66e55d4b9f967 - subnet-053e223fd30ba07de
补充说明
- 若栈1的栈名称是动态值,可在栈2中用
!Sub拼接导入名称,示例:
其中Role: !ImportValue !Sub "${Stack1Name}-LocalLambdaExecRole"Stack1Name需作为栈2的参数传入。 - 确保栈1和栈2处于同一AWS区域,且栈1已部署完成,导出名称未被其他栈占用。
内容的提问来源于stack exchange,提问作者Lalle
相关产品推荐
相关产品推荐

