mirror of
https://gitea.com/mcereda/oam.git
synced 2026-02-09 05:44:23 +00:00
Added example and KB to create a free ampere instance in Oracle Cloud
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,5 +8,7 @@
|
|||||||
.terraform/
|
.terraform/
|
||||||
.terraform.lock.hcl
|
.terraform.lock.hcl
|
||||||
*.auto.tfvars
|
*.auto.tfvars
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.backup
|
||||||
|
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|||||||
60
knowledge base/oci-cli.md
Normal file
60
knowledge base/oci-cli.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# OCI CLI
|
||||||
|
|
||||||
|
Oracle Cloud Infrastructure CLI.
|
||||||
|
|
||||||
|
1. [TL;DR](#tldr)
|
||||||
|
2. [Configuration](#configuration)
|
||||||
|
3. [Further readings](#further-readings)
|
||||||
|
|
||||||
|
## TL;DR
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Install the CLI.
|
||||||
|
brew install 'oci-cli'
|
||||||
|
|
||||||
|
# Start the interactive setup.
|
||||||
|
oci setup config
|
||||||
|
|
||||||
|
# Generate a key pair to include in the config file.
|
||||||
|
oci setup keys
|
||||||
|
|
||||||
|
# Show the current configuration.
|
||||||
|
cat ~/.oci/config
|
||||||
|
|
||||||
|
# List available compartments.
|
||||||
|
oci iam compartment list
|
||||||
|
oci iam compartment list -c 'tenancy_id'
|
||||||
|
|
||||||
|
# Create compartments.
|
||||||
|
oci iam compartment create -c 'root_compartment_id' \
|
||||||
|
--name 'compartment_name' --description 'friendly_description'
|
||||||
|
|
||||||
|
# List available availability domains.
|
||||||
|
oci iam availability-domain list
|
||||||
|
oci iam availability-domain list -c 'tenancy_id'
|
||||||
|
|
||||||
|
# List available compute images.
|
||||||
|
# Output is paginated.
|
||||||
|
oci compute image list -c 'tenancy_id' --all
|
||||||
|
oci compute image list -c 'tenancy_id' \
|
||||||
|
--operating-system 'Oracle Linux' --operating-system-version '8' \
|
||||||
|
--lifecycle-state 'AVAILABLE'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
| Unix location | Description |
|
||||||
|
| ------------------------ | -------------------------------------------------------------------------------------- |
|
||||||
|
| `~/.oci/config` | The default configuration file. |
|
||||||
|
| `~/.oci/oci_api_key.pem` | Full path and filename of the private key. The key pair **must be in the PEM format**. |
|
||||||
|
|
||||||
|
## Further readings
|
||||||
|
|
||||||
|
- [Command Line Interface]
|
||||||
|
- [SDK and CLI Configuration File]
|
||||||
|
- [Required keys and OCIDs]
|
||||||
|
|
||||||
|
<!-- oracle cloud's documentation -->
|
||||||
|
[command line interface]: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/cliconcepts.htm
|
||||||
|
[required keys and ocids]: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm
|
||||||
|
[sdk and cli configuration file]: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm
|
||||||
34
knowledge base/oracle cloud.md
Normal file
34
knowledge base/oracle cloud.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Oracle Cloud
|
||||||
|
|
||||||
|
1. [Concepts](#concepts)
|
||||||
|
1. [Compartments](#compartments)
|
||||||
|
2. [Further readings](#further-readings)
|
||||||
|
3. [Sources](#sources)
|
||||||
|
|
||||||
|
## Concepts
|
||||||
|
|
||||||
|
### Compartments
|
||||||
|
|
||||||
|
Compartments are tenancy-wide and extend across regions. They can also be nested to create hierarchies up to 6 levels deep.
|
||||||
|
|
||||||
|
After creating a compartment, you need to write at least one policy for it; until then, no one can access it except administrators or users who have permissions set at the tenancy level. When creating sub-compartments, they inherit access permissions from compartments higher up their hierarchy.
|
||||||
|
|
||||||
|
Before deleting a compartment, all its resources must have been moved, deleted or terminated, including any policies attached to the compartment itself.
|
||||||
|
|
||||||
|
## Further readings
|
||||||
|
|
||||||
|
- [oci-cli]
|
||||||
|
- [compute images]
|
||||||
|
|
||||||
|
## Sources
|
||||||
|
|
||||||
|
- [Required keys and OCIDs]
|
||||||
|
|
||||||
|
<!-- oracle cloud's documentation -->
|
||||||
|
[compute images]: https://docs.oracle.com/en-us/iaas/images/
|
||||||
|
[required keys and ocids]: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm
|
||||||
|
|
||||||
|
<!-- internal references -->
|
||||||
|
[oci-cli]: ./oci-cli.md
|
||||||
|
|
||||||
|
<!-- external references -->
|
||||||
37
terraform/oracle cloud free tier ampere instance/README.md
Normal file
37
terraform/oracle cloud free tier ampere instance/README.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Oracle free tier Ampere VM
|
||||||
|
|
||||||
|
Simple example to create an Ampere VM instance in Oracle Cloud's free tier.
|
||||||
|
|
||||||
|
1. [Requirements](#requirements)
|
||||||
|
2. [Further readings](#further-readings)
|
||||||
|
3. [Sources](#sources)
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
1. VCN
|
||||||
|
1. Public Subnet
|
||||||
|
|
||||||
|
For a Subnet to be considered Public, it needs to have associated a Route Table with a default route pointing to an Internet Gateway.
|
||||||
|
|
||||||
|
The default route table created using Terraform does not contain this route, nor it is possible to create the single route in it at the time of writing.<br />
|
||||||
|
A solution to this is to create a new Route Table **with** the default route above and attach it to the Subnet. See the code for details.
|
||||||
|
|
||||||
|
![requirements]
|
||||||
|
|
||||||
|
## Further readings
|
||||||
|
|
||||||
|
## Sources
|
||||||
|
|
||||||
|
- [Ridiculously powerful free server in the cloud]
|
||||||
|
- [Always free resources] in Oracle Cloud
|
||||||
|
- [Oracle Cloud Infrastructure Provider documentation]
|
||||||
|
- [oracle-terraform-modules/terraform-oci-compute-instance]
|
||||||
|
|
||||||
|
<!-- internal references -->
|
||||||
|
[requirements]: design/requirements.png
|
||||||
|
|
||||||
|
<!-- external references -->
|
||||||
|
[always free resources]: https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm
|
||||||
|
[oracle cloud infrastructure provider documentation]: https://registry.terraform.io/providers/oracle/oci/latest/docs
|
||||||
|
[ridiculously powerful free server in the cloud]: https://medium.com/codex/ridiculously-powerful-free-server-in-the-cloud-dd4da8524a9c
|
||||||
|
[oracle-terraform-modules/terraform-oci-compute-instance]: https://github.com/oracle-terraform-modules/terraform-oci-compute-instance
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
18
terraform/oracle cloud free tier ampere instance/design/requirements.py
Executable file
18
terraform/oracle cloud free tier ampere instance/design/requirements.py
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from diagrams import Cluster, Diagram
|
||||||
|
from diagrams.oci.compute import VM
|
||||||
|
from diagrams.oci.network import InternetGateway, RouteTable, Vcn
|
||||||
|
|
||||||
|
with Diagram("Requirements", show=False):
|
||||||
|
|
||||||
|
vcn = Vcn("VCN")
|
||||||
|
vm = VM("Ampere instance")
|
||||||
|
|
||||||
|
with Cluster("Public Subnet"):
|
||||||
|
|
||||||
|
ig = InternetGateway("Internet Gateway")
|
||||||
|
rt = RouteTable("Route Table")
|
||||||
|
|
||||||
|
vcn >> ig >> rt
|
||||||
|
rt >> vm
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
availability_domain = "FIXME" # get it with `oci iam availability-domain list`
|
||||||
|
compartment_id = "FIXME" # get it with `oci iam compartment list`
|
||||||
|
|
||||||
|
memory_in_gbs = 24
|
||||||
|
ocpus = 4
|
||||||
|
|
||||||
|
# get it with `oci compute image list -c 'tenancy_id'`
|
||||||
|
# or check https://docs.oracle.com/en-us/iaas/images/
|
||||||
|
source_id = "ocid1.image.oc1.eu-amsterdam-1.aaaaaaaavmra3s4va4fqd4vlcrqc5v5jyqov5vdla3x3b6gzc64n6dkpuqua"
|
||||||
|
|
||||||
|
ssh_authorized_keys = <<EOT
|
||||||
|
ssh-ed25519 key-1 comment
|
||||||
|
ssh-ed25519 key-n comment
|
||||||
|
EOT
|
||||||
61
terraform/oracle cloud free tier ampere instance/main.tf
Normal file
61
terraform/oracle cloud free tier ampere instance/main.tf
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/core_vcn
|
||||||
|
resource "oci_core_vcn" "this" {
|
||||||
|
compartment_id = var.compartment_id
|
||||||
|
cidr_blocks = ["10.0.0.0/16"]
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/core_subnet
|
||||||
|
resource "oci_core_subnet" "this" {
|
||||||
|
compartment_id = var.compartment_id
|
||||||
|
vcn_id = oci_core_vcn.this.id
|
||||||
|
cidr_block = "10.0.0.0/24"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Needed to be able to connect to the instance from the Internet.
|
||||||
|
# Need to create a route table with the default route 0.0.0.0/0 pointing to the
|
||||||
|
# internet gateway, and associate the subnet to it.
|
||||||
|
# https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/core_internet_gateway
|
||||||
|
resource "oci_core_internet_gateway" "this" {
|
||||||
|
compartment_id = var.compartment_id
|
||||||
|
vcn_id = oci_core_vcn.this.id
|
||||||
|
}
|
||||||
|
resource "oci_core_route_table" "this" {
|
||||||
|
compartment_id = var.compartment_id
|
||||||
|
vcn_id = oci_core_vcn.this.id
|
||||||
|
|
||||||
|
route_rules {
|
||||||
|
destination = "0.0.0.0/0"
|
||||||
|
destination_type = "CIDR_BLOCK"
|
||||||
|
network_entity_id = oci_core_internet_gateway.this.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resource "oci_core_route_table_attachment" "this" {
|
||||||
|
subnet_id = oci_core_subnet.this.id
|
||||||
|
route_table_id = oci_core_route_table.this.id
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/core_instance
|
||||||
|
resource "oci_core_instance" "this" {
|
||||||
|
compartment_id = var.compartment_id
|
||||||
|
availability_domain = var.availability_domain
|
||||||
|
shape = var.shape
|
||||||
|
|
||||||
|
create_vnic_details {
|
||||||
|
subnet_id = oci_core_subnet.this.id
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
ssh_authorized_keys = var.ssh_authorized_keys
|
||||||
|
}
|
||||||
|
|
||||||
|
shape_config {
|
||||||
|
memory_in_gbs = var.memory_in_gbs
|
||||||
|
ocpus = var.ocpus
|
||||||
|
}
|
||||||
|
|
||||||
|
source_details {
|
||||||
|
boot_volume_size_in_gbs = var.boot_volume_size_in_gbs
|
||||||
|
source_id = var.source_id
|
||||||
|
source_type = var.source_type
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
output "instance" {
|
||||||
|
value = oci_core_instance.this
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
variable "availability_domain" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
variable "compartment_id" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
variable "shape" {
|
||||||
|
type = string
|
||||||
|
default = "VM.Standard.A1.Flex"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "memory_in_gbs" {
|
||||||
|
type = number
|
||||||
|
default = 24
|
||||||
|
}
|
||||||
|
variable "ocpus" {
|
||||||
|
type = number
|
||||||
|
default = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "boot_volume_size_in_gbs" {
|
||||||
|
type = number
|
||||||
|
default = 50
|
||||||
|
}
|
||||||
|
variable "source_id" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
variable "source_type" {
|
||||||
|
type = string
|
||||||
|
default = "image"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_authorized_keys" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user