{"id":17720299,"url":"https://github.com/PatMyron/cloud","last_synced_at":"2025-03-14T04:30:51.872Z","repository":{"id":39620682,"uuid":"192835227","full_name":"PatMyron/cloud","owner":"PatMyron","description":"cloud region / instance type data","archived":false,"fork":false,"pushed_at":"2024-06-27T03:48:44.000Z","size":9132,"stargazers_count":61,"open_issues_count":8,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-27T05:37:06.532Z","etag":null,"topics":["aws","azure","cloud","cloudformation","gcp","instance-type","region","terraform"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PatMyron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-20T02:33:37.000Z","updated_at":"2024-06-27T03:48:01.000Z","dependencies_parsed_at":"2024-06-27T05:35:09.203Z","dependency_job_id":"31684827-c5b7-4c12-9249-324a16175699","html_url":"https://github.com/PatMyron/cloud","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PatMyron%2Fcloud","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PatMyron%2Fcloud/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PatMyron%2Fcloud/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PatMyron%2Fcloud/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PatMyron","download_url":"https://codeload.github.com/PatMyron/cloud/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243526347,"owners_count":20305107,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","azure","cloud","cloudformation","gcp","instance-type","region","terraform"],"created_at":"2024-10-25T15:26:38.609Z","updated_at":"2025-03-14T04:30:46.858Z","avatar_url":"https://github.com/PatMyron.png","language":null,"funding_links":[],"categories":["Others"],"sub_categories":[],"readme":"# [IP addresses per region](https://github.com/PatMyron/cloud/issues/11)\n\u003cimg src=\"img/aws-ip-addresses.png\" width=\"32%\"\u003e\u003c/img\u003e\n\u003cimg src=\"img/gcp-ip-addresses.png\" width=\"32%\"\u003e\u003c/img\u003e\n\u003cimg src=\"img/azure-ip-addresses.png\" width=\"32%\"\u003e\u003c/img\u003e\n\n# [compute / memory unit prices by virtual machine type](https://instances.vantage.sh/)\n![](img/ec2-unit-prices.png)\n![](img/gcp-unit-prices.png)\n![](img/azure-unit-prices.png)\n\n# product / feature regional availability\n![](img/services-per-region.png)\n![](img/resources-per-region.png)\n![](img/resources-per-region-by-region-launch-date.png)\n![](img/resources-per-service.png)\n![](img/gcp-products-per-region.png)\n![](img/azure-services-per-region.png)\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"https://azure.microsoft.com/en-us/global-infrastructure/services/?products=all\u0026regions=all\"\u003eAzure services per region\u003c/a\u003e\u003c/summary\u003e\n\n```python\nfrom bs4 import BeautifulSoup\n\n# save webpage locally to ensure table has fully loaded\nsoup = BeautifulSoup(open('https://azure.microsoft.com/en-us/global-infrastructure/services/?products=all\u0026regions=all'), 'html.parser')\nfor row in soup.find_all('tr', class_='service-row', attrs={'data-product-slug' : True}):\n    for cell in row.find_all(attrs={'data-region-slug' : True}):\n        if 'Not available' not in cell.text:\n            print(cell['data-region-slug'])\n```\n\n```shell\npython3 azure.py | sort | uniq -c | sort -nr | grep -v 'non-regional'\n# Azure services per region\n```\n\u003c/details\u003e\n\n# [availability zones per region](https://github.com/PatMyron/cloud/issues/16)\n\nhttps://aws.amazon.com/about-aws/global-infrastructure/regions_az/\n\nhttps://cloud.google.com/about/locations/\n\nhttps://learn.microsoft.com/en-us/azure/reliability/availability-zones-service-support\n\n![](img/azs-per-region.png)\n\n# instance type regional availability\n```shell\nfor REGION in $(aws ec2 describe-regions --query \"Regions[*].RegionName\" --output text)\ndo\n  echo $REGION\n  curl -s https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/$REGION/index.json | jq -r '.products[].attributes[\"instanceType\"]' | sort -u | grep '\\.' | sed 's/\\..*//' | sort -u\ndone\n\n# EC2 instance type regional availability\n# tl;dr: new regions do not offer old instance types\n\ncmr5 t3 (newer regions with no previous generation instance types):\neu-north-1\nap-east-1\nme-south-1\nus-gov-east-1\n\n------------\n\nr4-5:\neu-west-3\neu-west-2\nca-central-1\ncn-northwest-1\n\nr3-5:\nap-south-1\neu-west-1\nap-northeast-3\nap-northeast-2\nap-northeast-1\nap-southeast-1\nap-southeast-2\neu-central-1\nsa-east-1\nus-east-1\nus-east-2\nus-west-1\nus-west-2\nus-gov-west-1\ncn-north-1\n\n----------------\n\ncm4-5:\nap-south-1\neu-west-3\neu-west-2\nus-east-2\nca-central-1\ncn-northwest-1\n\ncm3-5:\neu-central-1\nap-northeast-3\nap-northeast-2\n\nc3-5 m1-5:\ncn-north-1\n\n-------------\n\nt2-t3:\nap-south-1\neu-west-3\neu-west-2\nap-northeast-3\nap-northeast-2\nca-central-1\neu-central-1\nus-east-2\ncn-north-1\ncn-northwest-1\n\n---------------\n\ncm1-5 t1-3 (oldest regions with all previous generation instance types):\neu-west-1\nap-northeast-1\nsa-east-1\nap-southeast-1\nap-southeast-2\nus-east-1\nus-west-1\nus-west-2\nus-gov-west-1\n```\n\n# [CloudFormation / Terraform](https://twitter.com/iann0036/status/1537613464943796224)\n![](img/resources-per-provider.png)\n\n```shell\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '          \"(.*?)\"' | sort | uniq -c | sort -nr\n# missing a few https://github.com/awsdocs/aws-cloudformation-user-guide/issues/4#issuecomment-503828259\n5443 UpdateType # property fields\n5443 Required\n5443 Documentation\n4283 PrimitiveType\n1493 Type\n 448 ItemType\n 445 DuplicatesAllowed\n 352 PrimitiveItemType\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '^      \"(.*?)\"' | sort | uniq -c | sort -nr\n1448 Documentation # resource fields\n1444 Properties\n 144 Attributes\n   4 UpdateType\n   4 Type\n   4 Required\n   4 ItemType\n   2 PrimitiveType\n   1 AdditionalProperties\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '(\"UpdateType\": \".*?)\"' | sort | uniq -c | sort -nr\n4030 \"UpdateType\": \"Mutable\n1370 \"UpdateType\": \"Immutable\n  47 \"UpdateType\": \"Conditional\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '(\"Required\": .*?),' | sort | uniq -c | sort -nr\n3689 \"Required\": false\n1758 \"Required\": true\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '(\"DuplicatesAllowed\": .*?),' | sort | uniq -c | sort -nr\n 313 \"DuplicatesAllowed\": false\n 132 \"DuplicatesAllowed\": true\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '(\"PrimitiveType\": .*?),' | sort | uniq -c | sort -nr\n3046 \"PrimitiveType\": \"String\"\n 382 \"PrimitiveType\": \"Integer\"\n 368 \"PrimitiveType\": \"Boolean\"\n  99 \"PrimitiveType\": \"Json\"\n  63 \"PrimitiveType\": \"Double\"\n   8 \"PrimitiveType\": \"Long\"\n   4 \"PrimitiveType\": \"Timestamp\"\n   1 \"PrimitiveType\": \"Map\"\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '(\"PrimitiveItemType\": .*?),' | sort | uniq -c | sort -nr\n 349 \"PrimitiveItemType\": \"String\"\n   2 \"PrimitiveItemType\": \"Boolean\"\n   1 \"PrimitiveItemType\": \"Json\"\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '(\"Type\": .*?),' | sort | uniq -c | sort -nr\n 735 \"Type\": \"List\"\n  48 \"Type\": \"Map\"\n  ..\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '(\"ItemType\": .*?),' | sort | uniq -c | sort -nr\n 108 \"ItemType\": \"Tag\"\n ...\n\n$ curl -s --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | jq '.ResourceTypes' | jq 'with_entries(.value |= .Attributes)' | grep -v ': null' | grep -v 'Type\": \"'\n# GetAtt attributes\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '::(.*)::' | sort | uniq -c | wc -l\n# services\n\n$ curl -s --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | jq '.ResourceTypes | length'\n# resource types\n\n$ curl -s --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | jq '.PropertyTypes | length'\n# property types\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '::(.*)::[^.]*\"' | sort | uniq -c | sort -nr\n# resource types per service\n\n$ diff -u \u003c(curl -s https://s3.eu-west-1.amazonaws.com/cfn-resource-specifications-eu-west-1-prod/latest/CloudFormationResourceSpecification.json | jq '.ResourceTypes | keys' | jq -S) \u003c(curl -s https://s3.us-west-2.amazonaws.com/cfn-resource-specifications-us-west-2-prod/latest/CloudFormationResourceSpecification.json | jq '.ResourceTypes | keys' | jq -S)\n# resource type difference between two regions\n\n$ curl -s -N https://raw.githubusercontent.com/patmyron/aws-cloudformation-user-guide/master/doc_source/cfn-resource-specification.md | pcregrep -o1 -o2 \"|  (\\w*-\\w*-\\w* ) .*//(.*?).cloudfront.*\" | xargs -L1 bash -c 'curl -s -N --compressed https://$1.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 \"::(.*)::\" | sort | uniq -c | wc -l | xargs echo -n; echo \" $0\"' | sort -nr\nfor REGION in ap-east-1 me-south-1 af-south-1 eu-south-1 ap-southeast-3 us-gov-west-1 us-gov-east-1\ndo\n  curl -s -N https://s3.$REGION.amazonaws.com/cfn-resource-specifications-$REGION-prod/latest/CloudFormationResourceSpecification.json | pcregrep -o1 '::(.*)::' | sort | uniq -c | wc -l | xargs echo -n; echo \" $REGION\"\ndone\nfor REGION in cn-north-1 cn-northwest-1\ndo\n  curl -s -N https://s3.$REGION.amazonaws.com.cn/cfn-resource-specifications-$REGION-prod/latest/CloudFormationResourceSpecification.json | pcregrep -o1 '::(.*)::' | sort | uniq -c | wc -l | xargs echo -n; echo \" $REGION\"\ndone\n# CloudFormation services per region\n\n$ curl -s -N https://raw.githubusercontent.com/patmyron/aws-cloudformation-user-guide/master/doc_source/cfn-resource-specification.md | pcregrep -o1 -o2 \"|  (\\w*-\\w*-\\w* ) .*//(.*?).cloudfront.*\" | xargs -L1 bash -c 'curl -s -N --compressed https://$1.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 \"::(.*)::[^.]*\\\"\" | wc -l | xargs echo -n; echo \" $0\"' | sort -nr\nfor REGION in ap-east-1 me-south-1 af-south-1 eu-south-1 ap-southeast-3 us-gov-west-1 us-gov-east-1\ndo\n  curl -s -N https://s3.$REGION.amazonaws.com/cfn-resource-specifications-$REGION-prod/latest/CloudFormationResourceSpecification.json | pcregrep -o1 '::(.*)::[^.]*\"' | wc -l | xargs echo -n; echo \" $REGION\"\ndone\nfor REGION in cn-north-1 cn-northwest-1\ndo\n  curl -s -N https://s3.$REGION.amazonaws.com.cn/cfn-resource-specifications-$REGION-prod/latest/CloudFormationResourceSpecification.json | pcregrep -o1 '::(.*)::[^.]*\"' | wc -l | xargs echo -n; echo \" $REGION\"\ndone\n# resource types per region\n\n$ curl -s -N --compressed https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | pcregrep -o1 '^        \"(.*?)\"' | sort | uniq -c | sort -nr | head -n 30\n 223 Name\n 137 Tags\n 107 Description\n  84 Type\n  77 Arn\n  59 Value\n  46 Id\n  44 Key\n  43 RoleArn\n  41 Enabled\n  25 Port\n  24 Parameters\n  24 InstanceType\n  22 Version\n  22 AvailabilityZone\n  21 SubnetId\n  20 SubnetIds\n  19 Values\n  19 SecurityGroupIds\n  18 VpcId\n  17 RoleARN\n  17 DomainName\n  16 KmsKeyId\n  16 ApiId\n  15 Protocol\n  15 MetricName\n  14 Path\n  14 ApplicationName\n  14 ApplicationId\n  13 Attributes\n```\n\n```shell\nterraform providers schema -json | jq '.provider_schemas .\"registry.terraform.io/hashicorp/aws\" .resource_schemas | length'\n# resource types\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FPatMyron%2Fcloud","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FPatMyron%2Fcloud","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FPatMyron%2Fcloud/lists"}