AWSTemplateFormatVersion: 2010-09-09 Description: >- AWS Fargate cluster that can span public and private subnets. Supports public facing load balancers, private internal load balancers, and both internal and external service discovery namespaces. Parameters: EnvironmentName: Type: String Default: development Description: 'Your deployment environment: DEV, QA , PROD' ServiceName: Type: String Default: example Description: A name for the service ImageUrl: Type: String Default: nginx Description: >- The url of a docker image that contains the application process that will handle the traffic for this service ContainerPort: Type: Number Default: 80 Description: What port number the application inside the docker container is binding to ContainerCpu: Type: Number Default: 1024 Description: How much CPU to give the container. 1024 is 1 CPU ContainerMemory: Type: Number Default: 2048 Description: How much memory in megabytes to give the container BUILDID: Type: String Default: '' Command: Type: String Default: 'ls' EntryPoint: Type: String Default: '/bin/sh' WorkingDirectory: Type: String Default: '/efsdata/' Role: Type: String Default: '' Description: >- (Optional) An IAM role to give the service's containers if the code within needs to access other AWS resources like S3 buckets, DynamoDB tables, etc EFSMountDirectory: Type: String Default: '/efsdata' GithubToken: Type: String Default: '0' UnityLicense: Type: String Default: '0' UnityEmail: Type: String Default: '0' UnityPassword: Type: String Default: '0' UnitySerial: Type: String Default: '0' AndroidKeystoreBase64: Type: String Default: '0' AndroidKeystorePass: Type: String Default: '0' AndroidKeyAliasPass: Type: String Default: '0' AWSAccessKeyID: Type: String Default: '0' AWSSecretAccessKey: Type: String Default: '0' Mappings: SubnetConfig: VPC: CIDR: 10.0.0.0/16 PublicOne: CIDR: 10.0.0.0/24 PublicTwo: CIDR: 10.0.1.0/24 Conditions: HasCustomRole: !Not - !Equals - Ref: Role - '' Resources: LogGroup: Type: 'AWS::Logs::LogGroup' Properties: LogGroupName: !Ref ServiceName Metadata: 'AWS::CloudFormation::Designer': id: aece53ae-b82d-4267-bc16-ed964b05db27 SubscriptionFilter: Type: 'AWS::Logs::SubscriptionFilter' Properties: FilterPattern: '' RoleArn: 'Fn::ImportValue': !Sub '${EnvironmentName}:CloudWatchIAMRole' LogGroupName: !Ref ServiceName DestinationArn: 'Fn::GetAtt': - KinesisStream - Arn Metadata: 'AWS::CloudFormation::Designer': id: 7f809e91-9e5d-4678-98c1-c5085956c480 DependsOn: - LogGroup - KinesisStream KinesisStream: Type: 'AWS::Kinesis::Stream' Properties: Name: !Ref ServiceName ShardCount: 1 Metadata: 'AWS::CloudFormation::Designer': id: c6f18447-b879-4696-8873-f981b2cedd2b GithubTokenSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'GithubToken', !Ref BUILDID ] ] SecretString: !Ref GithubToken UnityLicenseSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'UnityLicense', !Ref BUILDID ] ] SecretString: !Ref UnityLicense UnityEmailSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'UnityEmail', !Ref BUILDID ] ] SecretString: !Ref UnityEmail UnityPasswordSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'UnityPassword', !Ref BUILDID ] ] SecretString: !Ref UnityPassword UnitySerialSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'UnitySerial', !Ref BUILDID ] ] SecretString: !Ref UnitySerial AndroidKeystoreBase64Secret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'AndroidKeystoreBase64', !Ref BUILDID ] ] SecretString: !Ref AndroidKeystoreBase64 AndroidKeystorePassSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'AndroidKeystorePass', !Ref BUILDID ] ] SecretString: !Ref AndroidKeystorePass AndroidKeyAliasPassSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'AndroidKeyAliasPass', !Ref BUILDID ] ] SecretString: !Ref AndroidKeyAliasPass AWSAccessKeyIDSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'AWSAccessKeyID', !Ref BUILDID ] ] SecretString: !Ref AWSAccessKeyID AWSSecretAccessKeySecret: Type: AWS::SecretsManager::Secret Properties: Name: !Join [ "", [ 'AWSSecretAccessKey', !Ref BUILDID ] ] SecretString: !Ref AWSSecretAccessKey TaskDefinition: Type: 'AWS::ECS::TaskDefinition' Properties: Family: !Ref ServiceName Cpu: !Ref ContainerCpu Memory: !Ref ContainerMemory NetworkMode: awsvpc Volumes: - Name: efs-data EFSVolumeConfiguration: FilesystemId: 'Fn::ImportValue': !Sub '${EnvironmentName}:EfsFileStorageId' TransitEncryption: ENABLED RequiresCompatibilities: - FARGATE ExecutionRoleArn: 'Fn::ImportValue': !Sub '${EnvironmentName}:ECSTaskExecutionRole' TaskRoleArn: 'Fn::If': - HasCustomRole - !Ref Role - !Ref 'AWS::NoValue' ContainerDefinitions: - Name: !Ref ServiceName Cpu: !Ref ContainerCpu Memory: !Ref ContainerMemory Image: !Ref ImageUrl EntryPoint: Fn::Split: - "," - !Ref EntryPoint Command: Fn::Split: - "," - !Ref Command WorkingDirectory: !Ref WorkingDirectory Environment: - Name: ALLOW_EMPTY_PASSWORD Value: 'yes' MountPoints: - SourceVolume: efs-data ContainerPath: !Ref EFSMountDirectory ReadOnly: false Secrets: - Name: 'GITHUB_TOKEN' ValueFrom: !Ref GithubTokenSecret - Name: 'UNITY_LICENSE' ValueFrom: !Ref UnityLicenseSecret - Name: 'UNITY_EMAIL' ValueFrom: !Ref UnityEmailSecret - Name: 'UNITY_PASSWORD' ValueFrom: !Ref UnityPasswordSecret - Name: 'UNITY_SERIAL' ValueFrom: !Ref UnitySerialSecret - Name: 'ANDROID_KEYSTORE_BASE64' ValueFrom: !Ref AndroidKeystoreBase64Secret - Name: 'ANDROID_KEYSTORE_PASS' ValueFrom: !Ref AndroidKeystorePassSecret - Name: 'AWS_ACCESS_KEY_ID' ValueFrom: !Ref AWSAccessKeyIDSecret - Name: 'AWS_SECRET_ACCESS_KEY' ValueFrom: !Ref AWSSecretAccessKeySecret LogConfiguration: LogDriver: awslogs Options: awslogs-group: !Ref ServiceName awslogs-region: !Ref 'AWS::Region' awslogs-stream-prefix: !Ref ServiceName Metadata: 'AWS::CloudFormation::Designer': id: dabb0116-abe0-48a6-a8af-cf9111c879a5 DependsOn: - LogGroup Metadata: 'AWS::CloudFormation::Designer': dabb0116-abe0-48a6-a8af-cf9111c879a5: size: width: 60 height: 60 position: x: 270 'y': 90 z: 1 embeds: [] dependson: - aece53ae-b82d-4267-bc16-ed964b05db27 c6f18447-b879-4696-8873-f981b2cedd2b: size: width: 60 height: 60 position: x: 270 'y': 210 z: 1 embeds: [] 7f809e91-9e5d-4678-98c1-c5085956c480: size: width: 60 height: 60 position: x: 60 'y': 300 z: 1 embeds: [] dependson: - aece53ae-b82d-4267-bc16-ed964b05db27 - c6f18447-b879-4696-8873-f981b2cedd2b aece53ae-b82d-4267-bc16-ed964b05db27: size: width: 150 height: 150 position: x: 60 'y': 90 z: 1 embeds: [] 4d2da56c-3643-46b8-aaee-e46e19f95fcc: source: id: 7f809e91-9e5d-4678-98c1-c5085956c480 target: id: aece53ae-b82d-4267-bc16-ed964b05db27 z: 11 14eb957b-f094-4653-93c4-77b2f851953c: source: id: 7f809e91-9e5d-4678-98c1-c5085956c480 target: id: c6f18447-b879-4696-8873-f981b2cedd2b z: 12 85c57444-e5bb-4230-bc85-e545cd4558f6: source: id: dabb0116-abe0-48a6-a8af-cf9111c879a5 target: id: aece53ae-b82d-4267-bc16-ed964b05db27 z: 13