App runner with CloudFormation AWS (json, nodejs, java )
Huy Dang
Posted on June 4, 2024
Refer to the previous article to understand the architectural model:
https://dev.to/huydanggdg/migrate-heroku-to-aws-1d73
1.Setup connect github
2.Create file template json for Cloudformation
Example for nodejs
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"AppRunnerService": {
"Type": "AWS::AppRunner::Service",
"Properties": {
"ServiceName": "client",
"SourceConfiguration": {
"AuthenticationConfiguration": {
"ConnectionArn": "arn:aws:apprunner:ap-northeast-1:68972488xxx:connection/app/xxxxxxxxxx"
},
"CodeRepository": {
"RepositoryUrl": "https://github.com/huydanggdg/client",
"SourceCodeVersion": {
"Type": "BRANCH",
"Value": "main"
},
"CodeConfiguration": {
"ConfigurationSource": "API",
"CodeConfigurationValues": {
"Runtime": "NODEJS_14",
"StartCommand": "npm run production",
"BuildCommand": "npm install",
"Port": "8080"
}
}
}
},
"InstanceConfiguration": {
"Cpu": "1024",
"Memory": "2048"
}
}
}
}
}
Example for java
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"AppRunnerService": {
"Type": "AWS::AppRunner::Service",
"Properties": {
"ServiceName": "java-main",
"SourceConfiguration": {
"AuthenticationConfiguration": {
"ConnectionArn": "arn:aws:apprunner:ap-northeast-1:6897248xxxx:connection/app/xxxxxxx"
},
"CodeRepository": {
"RepositoryUrl": "https://github.com/huydanggdg/java-main",
"SourceCodeVersion": {
"Type": "BRANCH",
"Value": "main"
},
"CodeConfiguration": {
"ConfigurationSource": "API",
"CodeConfigurationValues": {
"Runtime": "CORRETTO_8",
"StartCommand": "java -Xms256m -jar target/gms_agm.jar .",
"BuildCommand": "mvn package",
"Port": "3020"
}
}
}
},
"InstanceConfiguration": {
"Cpu": "2048",
"Memory": "4096"
}
}
}
}
}
Example for Database
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "RDS PostgreSQL with Auto-Created VPC for Singer",
"Parameters": {
"DBPassword": {
"Type": "String",
"NoEcho": true,
"Description": "Password for the PostgreSQL database"
}
},
"Resources": {
"VPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "10.0.0.0/16",
"EnableDnsSupport": true,
"EnableDnsHostnames": true,
"Tags": [{ "Key": "Name", "Value": "SingerVPC" }]
}
},
"InternetGateway": {
"Type": "AWS::EC2::InternetGateway",
"Properties": {
"Tags": [{ "Key": "Name", "Value": "SingerIGW" }]
}
},
"VPCGatewayAttachment": {
"Type": "AWS::EC2::VPCGatewayAttachment",
"Properties": {
"VpcId": { "Ref": "VPC" },
"InternetGatewayId": { "Ref": "InternetGateway" }
}
},
"SubnetGroup": {
"Type": "AWS::RDS::DBSubnetGroup",
"Properties": {
"DBSubnetGroupDescription": "Subnets for Singer RDS",
"SubnetIds": [
{ "Ref": "PublicSubnet1" },
{ "Ref": "PublicSubnet2" }
]
}
},
"PublicSubnet1": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": { "Ref": "VPC" },
"CidrBlock": "10.0.0.0/24",
"AvailabilityZone": { "Fn::Select": [0, { "Fn::GetAZs": "" }] },
"MapPublicIpOnLaunch": true,
"Tags": [{ "Key": "Name", "Value": "SingerPublicSubnet1" }]
}
},
"PublicSubnet2": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": { "Ref": "VPC" },
"CidrBlock": "10.0.1.0/24",
"AvailabilityZone": { "Fn::Select": [1, { "Fn::GetAZs": "" }] },
"MapPublicIpOnLaunch": true,
"Tags": [{ "Key": "Name", "Value": "SingerPublicSubnet2" }]
}
},
"PostgreSQLInstance": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"AllocatedStorage": "20",
"DBInstanceClass": "db.t3.micro",
"Engine": "postgres",
"EngineVersion": "14",
"MasterUsername": "admin",
"MasterUserPassword": { "Ref": "DBPassword" },
"DBName": "singer_db",
"PubliclyAccessible": false,
"DBSubnetGroupName": { "Ref": "SubnetGroup" }
}
}
},
"Outputs": {
"PostgreSQLInstanceEndpoint": {
"Description": "Endpoint for the PostgreSQL instance",
"Value": { "Fn::GetAtt": ["PostgreSQLInstance", "Endpoint.Address"] }
}
}
}
3.Run code
Default option and review => Submit
4.Check service
5.Delete Stack => AWS auto clear service
💖 💪 🙅 🚩
Huy Dang
Posted on June 4, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.