OCI Operations Associate - Infrastructure Operations¶
Table of Contents¶
Infrastructure Provisioning¶
Compute Provisioning¶
Instance Lifecycle Management:
# Launch instance
oci compute instance launch \
--availability-domain "Uocm:PHX-AD-1" \
--compartment-id ocid1.compartment... \
--shape "VM.Standard.E4.Flex" \
--shape-config '{"ocpus":2,"memoryInGBs":16}' \
--subnet-id ocid1.subnet... \
--image-id ocid1.image... \
--display-name "app-server-01"
# Start/Stop/Reboot
oci compute instance action \
--instance-id ocid1.instance... \
--action STOP
oci compute instance action \
--instance-id ocid1.instance... \
--action START
# Terminate
oci compute instance terminate \
--instance-id ocid1.instance... \
--preserve-boot-volume true
Bulk Operations:
# Python script for bulk instance management
import oci
config = oci.config.from_file()
compute = oci.core.ComputeClient(config)
def stop_all_dev_instances(compartment_id):
instances = compute.list_instances(
compartment_id=compartment_id,
lifecycle_state="RUNNING"
).data
for instance in instances:
if "dev-" in instance.display_name.lower():
print(f"Stopping {instance.display_name}")
compute.instance_action(
instance.id,
"STOP"
)
def start_instances_by_tag(compartment_id, tag_key, tag_value):
instances = compute.list_instances(
compartment_id=compartment_id,
lifecycle_state="STOPPED"
).data
for instance in instances:
if instance.freeform_tags.get(tag_key) == tag_value:
print(f"Starting {instance.display_name}")
compute.instance_action(
instance.id,
"START"
)
Network Provisioning¶
VCN Creation Template:
# Create VCN
VCN_ID=$(oci network vcn create \
--compartment-id $COMPARTMENT_ID \
--cidr-block "10.0.0.0/16" \
--display-name "prod-vcn" \
--dns-label "prodvcn" \
--query 'data.id' --raw-output)
# Create Internet Gateway
IGW_ID=$(oci network internet-gateway create \
--compartment-id $COMPARTMENT_ID \
--vcn-id $VCN_ID \
--is-enabled true \
--display-name "internet-gateway" \
--query 'data.id' --raw-output)
# Create NAT Gateway
NAT_ID=$(oci network nat-gateway create \
--compartment-id $COMPARTMENT_ID \
--vcn-id $VCN_ID \
--display-name "nat-gateway" \
--query 'data.id' --raw-output)
# Create Service Gateway
SGW_ID=$(oci network service-gateway create \
--compartment-id $COMPARTMENT_ID \
--vcn-id $VCN_ID \
--services '[{"serviceId":"ocid1.service..."}]' \
--display-name "service-gateway" \
--query 'data.id' --raw-output)
# Create public subnet
oci network subnet create \
--compartment-id $COMPARTMENT_ID \
--vcn-id $VCN_ID \
--cidr-block "10.0.1.0/24" \
--display-name "public-subnet" \
--route-table-id $PUBLIC_RT_ID \
--security-list-ids "[\"$PUBLIC_SL_ID\"]"
Storage Provisioning¶
Block Volume Operations:
# Create volume
oci bv volume create \
--availability-domain "Uocm:PHX-AD-1" \
--compartment-id $COMPARTMENT_ID \
--display-name "data-volume-01" \
--size-in-gbs 500 \
--vpus-per-gb 10
# Attach to instance
oci compute volume-attachment attach \
--instance-id $INSTANCE_ID \
--volume-id $VOLUME_ID \
--type iscsi
# Detach volume
oci compute volume-attachment detach \
--volume-attachment-id $ATTACHMENT_ID
# Resize volume
oci bv volume update \
--volume-id $VOLUME_ID \
--size-in-gbs 1000
# Clone volume
oci bv volume create \
--availability-domain "Uocm:PHX-AD-1" \
--compartment-id $COMPARTMENT_ID \
--source-volume-id $SOURCE_VOLUME_ID \
--display-name "data-volume-clone"
Object Storage Operations:
# Create bucket
oci os bucket create \
--compartment-id $COMPARTMENT_ID \
--name "application-data" \
--storage-tier Standard \
--public-access-type NoPublicAccess
# Upload files
oci os object put \
--bucket-name "application-data" \
--file /path/to/file.txt \
--name "file.txt"
# Bulk upload
oci os object bulk-upload \
--bucket-name "application-data" \
--src-dir /path/to/directory
# Download
oci os object get \
--bucket-name "application-data" \
--name "file.txt" \
--file /path/to/download/file.txt
# Bulk download
oci os object bulk-download \
--bucket-name "application-data" \
--download-dir /path/to/download
Resource Management¶
Tagging Strategy¶
Tag Namespaces:
# Create tag namespace
oci iam tag-namespace create \
--compartment-id $TENANCY_ID \
--name "Operations" \
--description "Operational tags"
# Create tag keys
oci iam tag create \
--tag-namespace-id $NAMESPACE_ID \
--name "Environment" \
--description "Deployment environment"
oci iam tag create \
--tag-namespace-id $NAMESPACE_ID \
--name "Owner" \
--description "Resource owner"
oci iam tag create \
--tag-namespace-id $NAMESPACE_ID \
--name "CostCenter" \
--description "Cost center for billing"
Applying Tags:
# Tag instance
oci compute instance update \
--instance-id $INSTANCE_ID \
--defined-tags '{
"Operations": {
"Environment":"Production",
"Owner":"TeamA",
"CostCenter":"Engineering"
}
}'
# Bulk tagging script
for instance in $(oci compute instance list \
--compartment-id $COMPARTMENT_ID \
--query 'data[].id' --raw-output)
do
oci compute instance update \
--instance-id $instance \
--defined-tags '{"Operations":{"Environment":"Development"}}'
done
Tag Defaults:
# Set default tags for compartment
oci iam tag-default create \
--compartment-id $COMPARTMENT_ID \
--tag-definition-id $TAG_DEF_ID \
--value "Development"
# All new resources in compartment get this tag automatically
Resource Quotas¶
Viewing Quotas:
# List service limits
oci limits service list
# Get specific limit
oci limits value get \
--service-name compute \
--scope-type AD \
--availability-domain "Uocm:PHX-AD-1" \
--name "standard-a1-core-count"
# List resource availability
oci limits resource-availability get \
--service-name compute \
--limit-name "standard-e4-core-count" \
--compartment-id $COMPARTMENT_ID \
--availability-domain "Uocm:PHX-AD-1"
Setting Quotas:
# Create quota policy
oci limits quota create \
--compartment-id $COMPARTMENT_ID \
--name "Dev-Quota" \
--description "Development environment limits" \
--statements '[
"Set compute quotas standard-e4-core-count to 20 in compartment Development",
"Set storage quotas volume-count to 50 in compartment Development",
"Set storage quotas total-storage-gb to 5000 in compartment Development"
]'
Compartment Management¶
Creating Compartment Hierarchy:
# Create root-level compartments
PROD_ID=$(oci iam compartment create \
--compartment-id $TENANCY_ID \
--name "Production" \
--description "Production resources" \
--query 'data.id' --raw-output)
DEV_ID=$(oci iam compartment create \
--compartment-id $TENANCY_ID \
--name "Development" \
--description "Development resources" \
--query 'data.id' --raw-output)
# Create sub-compartments
oci iam compartment create \
--compartment-id $PROD_ID \
--name "Prod-Network" \
--description "Production networking"
oci iam compartment create \
--compartment-id $PROD_ID \
--name "Prod-Compute" \
--description "Production compute"
Moving Resources:
# Move instance to different compartment
oci compute instance update \
--instance-id $INSTANCE_ID \
--compartment-id $NEW_COMPARTMENT_ID
# Move volume
oci bv volume update \
--volume-id $VOLUME_ID \
--compartment-id $NEW_COMPARTMENT_ID
# Move VCN
oci network vcn update \
--vcn-id $VCN_ID \
--compartment-id $NEW_COMPARTMENT_ID
Automation¶
Resource Manager¶
Stack Management:
# Create stack from local TF files
zip -r infrastructure.zip *.tf
oci resource-manager stack create \
--compartment-id $COMPARTMENT_ID \
--config-source infrastructure.zip \
--display-name "production-infrastructure" \
--variables file://variables.json
# Apply stack
APPLY_JOB=$(oci resource-manager job create-apply-job \
--stack-id $STACK_ID \
--execution-plan-strategy AUTO_APPROVED \
--query 'data.id' --raw-output)
# Monitor job
oci resource-manager job get \
--job-id $APPLY_JOB \
--query 'data.lifecycle-state'
# View logs
oci resource-manager job get-job-logs \
--job-id $APPLY_JOB
Drift Detection:
# Detect drift
DRIFT_JOB=$(oci resource-manager stack detect-drift \
--stack-id $STACK_ID \
--query 'data.id' --raw-output)
# View drift
oci resource-manager job get-job-detailed-log-content \
--job-id $DRIFT_JOB | jq '.data[] | select(.type=="DRIFT")'
Scheduling Operations¶
Instance Scheduling:
#!/usr/bin/env python3
# Schedule: Run daily via cron or OCI Functions
import oci
from datetime import datetime
config = oci.config.from_file()
compute = oci.core.ComputeClient(config)
def schedule_instances():
current_hour = datetime.now().hour
current_day = datetime.now().weekday() # 0=Monday, 6=Sunday
# Stop instances after business hours
if current_hour >= 18 or current_hour < 8 or current_day >= 5:
action = "STOP"
tag_value = "scheduled"
else:
action = "START"
tag_value = "scheduled"
instances = compute.list_instances(
compartment_id=config["compartment_id"],
lifecycle_state="RUNNING" if action == "STOP" else "STOPPED"
).data
for instance in instances:
if instance.defined_tags.get("Operations", {}).get("Schedule") == tag_value:
print(f"{action}: {instance.display_name}")
compute.instance_action(instance.id, action)
if __name__ == "__main__":
schedule_instances()
Automated Backup Script:
#!/bin/bash
# Run daily via cron
COMPARTMENT_ID="ocid1.compartment..."
BACKUP_PREFIX="auto-backup-$(date +%Y%m%d)"
# Backup all volumes
for VOLUME_ID in $(oci bv volume list \
--compartment-id $COMPARTMENT_ID \
--query 'data[].id' --raw-output)
do
VOLUME_NAME=$(oci bv volume get \
--volume-id $VOLUME_ID \
--query 'data."display-name"' --raw-output)
echo "Backing up $VOLUME_NAME"
oci bv backup create \
--volume-id $VOLUME_ID \
--display-name "${BACKUP_PREFIX}-${VOLUME_NAME}" \
--type FULL
done
# Delete backups older than 30 days
CUTOFF_DATE=$(date -d "30 days ago" +%Y-%m-%d)
for BACKUP_ID in $(oci bv backup list \
--compartment-id $COMPARTMENT_ID \
--query "data[?\"time-created\"<'${CUTOFF_DATE}'].id" --raw-output)
do
echo "Deleting old backup $BACKUP_ID"
oci bv backup delete --backup-id $BACKUP_ID --force
done
Monitoring Automation¶
Auto-Remediation Function:
# OCI Function triggered by alarm
import oci
import json
def handler(ctx, data: io.BytesIO = None):
"""Auto-remediate high CPU by scaling"""
alarm = json.loads(data.getvalue())
if alarm["alarmMetaData"][0]["namespace"] == "oci_computeagent":
instance_id = alarm["alarmMetaData"][0]["dimensions"]["resourceId"]
# Authenticate
signer = oci.auth.signers.get_resource_principals_signer()
compute = oci.core.ComputeClient(config={}, signer=signer)
# Get current shape
instance = compute.get_instance(instance_id).data
# Scale up (add 2 OCPUs)
if "Flex" in instance.shape:
current_ocpus = instance.shape_config.ocpus
new_ocpus = current_ocpus + 2
compute.update_instance(
instance_id,
oci.core.models.UpdateInstanceDetails(
shape_config=oci.core.models.UpdateInstanceShapeConfigDetails(
ocpus=new_ocpus
)
)
)
return {"status": "scaled", "from": current_ocpus, "to": new_ocpus}
return {"status": "no action"}
Backup and Recovery¶
Backup Policies¶
Volume Backup Policies:
# Assign Gold policy (daily, weekly, monthly, yearly)
oci bv volume update \
--volume-id $VOLUME_ID \
--backup-policy-id ocid1.volumebackuppolicy.oc1..gold
# Assign Silver policy (weekly)
oci bv volume update \
--volume-id $VOLUME_ID \
--backup-policy-id ocid1.volumebackuppolicy.oc1..silver
# Assign Bronze policy (monthly)
oci bv volume update \
--volume-id $VOLUME_ID \
--backup-policy-id ocid1.volumebackuppolicy.oc1..bronze
# Custom backup policy
oci bv volume-backup-policy create \
--compartment-id $COMPARTMENT_ID \
--display-name "Custom-Daily" \
--schedules '[{
"backupType":"FULL",
"period":"ONE_DAY",
"retentionSeconds":2592000,
"timeZone":"UTC"
}]'
Boot Volume Backups:
# Manual backup
oci bv boot-volume-backup create \
--boot-volume-id $BOOT_VOLUME_ID \
--display-name "boot-backup-$(date +%Y%m%d)"
# Automatic backups (via policy)
oci bv boot-volume update \
--boot-volume-id $BOOT_VOLUME_ID \
--backup-policy-id ocid1.volumebackuppolicy.oc1..gold
Database Backups¶
Autonomous Database:
# Manual backup
oci db autonomous-database create-backup \
--autonomous-database-id $ADB_ID \
--display-name "pre-upgrade-backup"
# List backups
oci db autonomous-database-backup list \
--autonomous-database-id $ADB_ID
# Restore
oci db autonomous-database restore \
--autonomous-database-id $ADB_ID \
--timestamp "2024-10-10T14:30:00Z"
DB Systems:
# Configure automatic backups
oci db database update \
--database-id $DATABASE_ID \
--db-backup-config '{
"autoBackupEnabled":true,
"recoveryWindowInDays":30,
"autoBackupWindow":"SLOT_TWO"
}'
# Manual backup
oci db backup create \
--database-id $DATABASE_ID \
--display-name "manual-backup"
Disaster Recovery¶
Cross-Region Volume Copy:
# Backup volume
BACKUP_ID=$(oci bv backup create \
--volume-id $VOLUME_ID \
--display-name "dr-backup" \
--query 'data.id' --raw-output)
# Copy to DR region
oci bv backup copy \
--backup-id $BACKUP_ID \
--destination-region "us-ashburn-1" \
--display-name "dr-backup-copy"
Object Storage Replication:
# Enable replication
oci os replication create-replication-policy \
--bucket-name "production-data" \
--destination-bucket-name "dr-data" \
--destination-region "us-ashburn-1" \
--name "prod-to-dr-replication"
Exam Tips¶
Critical Concepts¶
Provisioning: - Instance lifecycle: Launch, start, stop, terminate - Bulk operations for efficiency - Network setup: VCN, subnets, gateways - Storage: Block volumes, Object Storage
Management: - Tagging: Organize and track resources - Quotas: Limit resource usage - Compartments: Organize and isolate - Moving resources between compartments
Automation: - Resource Manager: Infrastructure as Code - Scheduling: Start/stop instances automatically - Scripts: Automate repetitive tasks - Event-driven: Functions triggered by events
Backup: - Volume backup policies: Gold, Silver, Bronze - Boot volume backups - Database backups (manual and automatic) - Cross-region copies for DR
Common Scenarios¶
Q: Automate nightly backups? A: Backup policy or scheduled script
Q: Stop dev instances after hours? A: Scheduled script with tagging
Q: Manage infrastructure as code? A: Resource Manager (Terraform)
Q: Track costs by department? A: Tagging with CostCenter tag
Q: Limit resources in Dev compartment? A: Quota policy
Summary¶
Provisioning: Compute, network, storage - automate where possible
Management: Tags, quotas, compartments, resource tracking
Automation: Resource Manager, scheduling, scripts, event-driven
Backup: Policies, manual backups, DR copies, retention
Next: Monitoring and Troubleshooting