Let's consider the following Mappings and FindInMap are used in the same AWS CloudFormation template. They will work.
Now, consider the VpcIds under Mappings are in the master.yaml template, and I am trying to create the EgressOnlyInternetGateway resource from the nested.yaml template using those Mappings located in the master.yaml template.
How can I accomplish this?
# master.yaml
Mappings:
VpcIds:
us-east-1:
"123456789012": "vpc-00011122233344455"
"234567890123": "vpc-11122233344455566"
us-west-1:
"123456789012": "vpc-22233344455566677"
"234567890123": "vpc-33344455566677788"
# nested.yaml
Resources:
EgressOnlyInternetGateway:
Type: AWS::EC2::EgressOnlyInternetGateway
Properties:
VpcId: !FindInMap [VpcIds, !Ref "AWS::Region", !Ref "AWS::AccountId"]
Update: I am trying to create a resource MyTestNestedSg in MyTestNestedStack (MyTestNestedStack.yaml) using the a mapped parameter defined in MyTestMasterStack as showing below. I am getting error: Parameter values specified for a template which does not require them, against MyTestNestedStack.
How can I resolve this?
Please note that the resource MyTestMasterSg under MyTestMasterStack is just for the completeness.
# MyTestMasterStack.yaml
Mappings:
VpcIds:
us-east-1:
"123456789012": "vpc-00011122233344455"
"234567890123": "vpc-11122233344455566"
Resources:
MyTestNestedStack:
Type: AWS::CloudFormation::Stack
Properties:
Parameters:
VpcId: !FindInMap [VpcIds, !Ref "AWS::Region", !Ref "AWS::AccountId"]
TemplateURL: "https://s3.amazonaws.com/my_template_bucket_name/MyTestNestedStack.yaml"
TimeoutInMinutes: 60
MyTestMasterSg:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: "vpc-017a12485ad93e94a"
GroupDescription: Testing resource creation wtih Mappings from the parent Stack
GroupName: MyTestMasterSg
SecurityGroupIngress:
- CidrIp: 10.1.0.0/16
FromPort: 80
IpProtocol: tcp
ToPort: 80
# MyTestNestedStack.yaml
Resources:
MyTestNestedSg:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VpcId
GroupDescription: Testing resource creation wtih Mappings from the parent Stack
GroupName: MyTestNestedSg
SecurityGroupIngress:
- CidrIp: 10.1.0.0/16
FromPort: 8080
IpProtocol: tcp
ToPort: 8080
You can't do this. You have to past resolved mapping values through Parameters to your
AWS::CloudFormation::Stackresource.Nested stacks should be self sufficient and they don't have access to the parent stack's parameters, mappings or resources. They can only work with data that you explicitly pass through
ParametersofAWS::CloudFormation::Stackresource.So in parent stack you would have to do:
Update
Your
MyTestNestedStack.yamlis missingParamters: