Пример конфигурации CloudFormation, который создает VPC, Gateway, Security Group, EC2 Instance, подключает уже существующую IAM роль, которой разрешен доступ на чтение в приватном S3 Bucket, который уже существует и нем лежит скрипт для дальнейшей настройки EC2 Instance. Пример использования UserData в EC2 Instance
AWSTemplateFormatVersion: "2010-09-09" Description: 'Auto create VPC with instance' ########################################### BLOCK WITH ENVIRONMENTS ########################################### Parameters: ProjectName: Type: String Default: Test-VPC Description: Name of project. VpcBlock: Type: String Default: 192.168.0.0/16 Description: The CIDR range for the VPC. This should be a valid private (RFC 1918) CIDR range. SubNetwork01: Type: String Default: 192.168.1.0/24 Description: CIDR block for subnetwork 01 (part from pool VPC Block). SSHKeyName: Type: String Default: artem-aws-key Description: Name of SSH key. Image: Type: String Default: ami-0ff8a91507f77f867 Description: Image for instance (Default - Amazon Linux, if you changes it, you must check Instance UserData) Region: Type: String Default: us-east-1b Description: Region (Default - U.S. Virginia) Bucket: Type: String Default: private-s3-bucket Description: Name of Bucket AIMRoleName: Type: String Default: artem-s3 Description: Name of AIM role ConstraintDescription: (read permission from S3 Bucket) ############################################# BLOCK WITH NETWORK ############################################# Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcBlock EnableDnsSupport: true EnableDnsHostnames: true InternetGateway: Type: AWS::EC2::InternetGateway VPCGatewayAttachment: Type: "AWS::EC2::VPCGatewayAttachment" Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: Public Subnets - Key: Network Value: Public Route: DependsOn: VPCGatewayAttachment Type: AWS::EC2::Route Properties: RouteTableId: !Ref RouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway ### IF YOU NEED MORE, THAT ONE SUBNET, DUPLICATE BLOCK BELOW WITH OTHER NAME AND ADD CIDR BLOCK FOR IT SubNet01: Type: AWS::EC2::Subnet Properties: CidrBlock: !Ref SubNetwork01 VpcId: !Ref VPC AvailabilityZone: !Ref Region Subnet01RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref SubNet01 RouteTableId: !Ref RouteTable ########################################## BLOCK WITH SECURITY GROUP ######################################### InstanceSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupName: !Ref ProjectName GroupDescription: !Ref ProjectName VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0 Description: SSH - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 Description: HTTP InstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: / Roles: - !Ref AIMRoleName ########################################## BLOCK WITH EC2 INSTANCES ########################################## Ec2Instance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Authentication: rolebased: type: "S3" buckets: - !Ref AIMRoleName roleName: - !Ref AIMRoleName Properties: IamInstanceProfile: !Ref InstanceProfile ImageId: !Ref Image InstanceType: t2.micro KeyName: !Ref SSHKeyName BlockDeviceMappings: - DeviceName: /dev/sdm Ebs: VolumeType: io1 Iops: 200 DeleteOnTermination: true VolumeSize: 20 NetworkInterfaces: - AssociatePublicIpAddress: true DeleteOnTermination: true DeviceIndex: 0 SubnetId: !Ref SubNet01 GroupSet: - !Ref InstanceSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -x /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource Ec2Instance --region ${AWS::Region} /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource Ec2Instance --region ${AWS::Region} aws s3 cp s3://private-s3-bucket/my_script.sh /tmp/my_script.sh chmod +x /tmp/my_script.sh /tmp/my_script.sh ###############################################################################################################