@marcfargas/skills 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/skills/index.json +46 -0
- package/README.md +9 -1
- package/azure/azcli/SKILL.md +150 -0
- package/azure/azcli/auth.md +160 -0
- package/azure/azcli/automation.md +270 -0
- package/azure/azcli/compute.md +222 -0
- package/azure/azcli/data.md +220 -0
- package/azure/azcli/iam.md +184 -0
- package/azure/azcli/serverless.md +242 -0
- package/azure/azcli/storage.md +215 -0
- package/google-cloud/gcloud/SKILL.md +2 -1
- package/google-cloud/gcloud/auth.md +2 -0
- package/maintenance/repo-hygiene/SKILL.md +449 -0
- package/package.json +13 -2
- package/release/pre-release/SKILL.md +21 -29
- package/search/web-search/SKILL.md +2 -2
- package/sheet-model/SKILL.md +8 -4
- package/terminal/vhs/SKILL.md +2 -0
- package/search/web-search/package-lock.json +0 -617
- package/sheet-model/package-lock.json +0 -1035
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Compute & Networking
|
|
2
|
+
|
|
3
|
+
## Virtual Machines
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
# READ — list VMs
|
|
7
|
+
az vm list -o json
|
|
8
|
+
az vm list --resource-group my-rg -o table
|
|
9
|
+
az vm list --resource-group my-rg --query "[].{Name:name, Size:hardwareProfile.vmSize, Status:powerState}" -o table
|
|
10
|
+
|
|
11
|
+
# Show VM details
|
|
12
|
+
az vm show --name my-vm --resource-group my-rg -o json
|
|
13
|
+
|
|
14
|
+
# Show VM with instance view (power state)
|
|
15
|
+
az vm get-instance-view --name my-vm --resource-group my-rg \
|
|
16
|
+
--query "{Name:name, Status:instanceView.statuses[1].displayStatus}" -o json
|
|
17
|
+
|
|
18
|
+
# EXPENSIVE — create VM (~$5-2000+/mo depending on size)
|
|
19
|
+
az vm create \
|
|
20
|
+
--resource-group my-rg \
|
|
21
|
+
--name my-vm \
|
|
22
|
+
--image Ubuntu2204 \
|
|
23
|
+
--size Standard_B2s \
|
|
24
|
+
--admin-username azureuser \
|
|
25
|
+
--generate-ssh-keys \
|
|
26
|
+
--location westeurope
|
|
27
|
+
|
|
28
|
+
# Windows VM
|
|
29
|
+
az vm create \
|
|
30
|
+
--resource-group my-rg \
|
|
31
|
+
--name my-win-vm \
|
|
32
|
+
--image Win2022Datacenter \
|
|
33
|
+
--size Standard_B2s \
|
|
34
|
+
--admin-username azureuser \
|
|
35
|
+
--admin-password "$(az keyvault secret show --vault-name my-vault --name vm-pwd --query value -o tsv)"
|
|
36
|
+
|
|
37
|
+
# SSH into VM
|
|
38
|
+
az ssh vm --resource-group my-rg --name my-vm
|
|
39
|
+
# Or with native SSH (needs public IP)
|
|
40
|
+
ssh azureuser@$(az vm show --name my-vm -g my-rg --show-details --query publicIps -o tsv)
|
|
41
|
+
|
|
42
|
+
# Lifecycle
|
|
43
|
+
az vm start --name my-vm --resource-group my-rg
|
|
44
|
+
az vm stop --name my-vm --resource-group my-rg # still billed for compute
|
|
45
|
+
az vm deallocate --name my-vm --resource-group my-rg # stops billing for compute
|
|
46
|
+
az vm restart --name my-vm --resource-group my-rg
|
|
47
|
+
|
|
48
|
+
# Resize
|
|
49
|
+
az vm resize --name my-vm --resource-group my-rg --size Standard_B4ms
|
|
50
|
+
|
|
51
|
+
# ⚠️ DESTRUCTIVE
|
|
52
|
+
az vm delete --name my-vm --resource-group my-rg
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### VM Images
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# List popular images
|
|
59
|
+
az vm image list -o table # cached popular images
|
|
60
|
+
az vm image list --all --publisher Canonical -o table # all from publisher (slow)
|
|
61
|
+
az vm image list --offer UbuntuServer --sku 22_04 --all -o table
|
|
62
|
+
|
|
63
|
+
# List available sizes in a region
|
|
64
|
+
az vm list-sizes --location westeurope -o table
|
|
65
|
+
az vm list-sizes --location westeurope --query "[?numberOfCores<=`4`]" -o table
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Network Security Groups (NSGs)
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Create NSG
|
|
72
|
+
az network nsg create --resource-group my-rg --name my-nsg
|
|
73
|
+
|
|
74
|
+
# READ
|
|
75
|
+
az network nsg list --resource-group my-rg -o json
|
|
76
|
+
az network nsg rule list --nsg-name my-nsg --resource-group my-rg -o table
|
|
77
|
+
|
|
78
|
+
# ⚠️ SECURITY — open ports
|
|
79
|
+
az network nsg rule create \
|
|
80
|
+
--resource-group my-rg \
|
|
81
|
+
--nsg-name my-nsg \
|
|
82
|
+
--name allow-http \
|
|
83
|
+
--priority 100 \
|
|
84
|
+
--access Allow \
|
|
85
|
+
--protocol Tcp \
|
|
86
|
+
--destination-port-ranges 80 443 \
|
|
87
|
+
--direction Inbound
|
|
88
|
+
|
|
89
|
+
# ⚠️ DESTRUCTIVE
|
|
90
|
+
az network nsg rule delete --resource-group my-rg --nsg-name my-nsg --name allow-http
|
|
91
|
+
az network nsg delete --resource-group my-rg --name my-nsg
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Virtual Networks (VNets)
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Create VNet with subnet
|
|
98
|
+
az network vnet create \
|
|
99
|
+
--resource-group my-rg \
|
|
100
|
+
--name my-vnet \
|
|
101
|
+
--address-prefix 10.0.0.0/16 \
|
|
102
|
+
--subnet-name default \
|
|
103
|
+
--subnet-prefix 10.0.0.0/24
|
|
104
|
+
|
|
105
|
+
# READ
|
|
106
|
+
az network vnet list --resource-group my-rg -o json
|
|
107
|
+
az network vnet show --name my-vnet --resource-group my-rg -o json
|
|
108
|
+
|
|
109
|
+
# Add subnet
|
|
110
|
+
az network vnet subnet create \
|
|
111
|
+
--resource-group my-rg \
|
|
112
|
+
--vnet-name my-vnet \
|
|
113
|
+
--name backend-subnet \
|
|
114
|
+
--address-prefixes 10.0.1.0/24
|
|
115
|
+
|
|
116
|
+
# List subnets
|
|
117
|
+
az network vnet subnet list --resource-group my-rg --vnet-name my-vnet -o table
|
|
118
|
+
|
|
119
|
+
# ⚠️ DESTRUCTIVE
|
|
120
|
+
az network vnet delete --name my-vnet --resource-group my-rg
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Public IPs
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
az network public-ip create --resource-group my-rg --name my-ip --sku Standard
|
|
127
|
+
az network public-ip list --resource-group my-rg -o table
|
|
128
|
+
az network public-ip show --name my-ip --resource-group my-rg --query ipAddress -o tsv
|
|
129
|
+
|
|
130
|
+
# ⚠️ Unattached static IPs cost ~$3.65/month
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## DNS Zones
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# Create zone
|
|
137
|
+
az network dns zone create --resource-group my-rg --name example.com
|
|
138
|
+
|
|
139
|
+
# READ
|
|
140
|
+
az network dns zone list --resource-group my-rg -o json
|
|
141
|
+
az network dns record-set list --resource-group my-rg --zone-name example.com -o table
|
|
142
|
+
|
|
143
|
+
# Add A record
|
|
144
|
+
az network dns record-set a add-record \
|
|
145
|
+
--resource-group my-rg \
|
|
146
|
+
--zone-name example.com \
|
|
147
|
+
--record-set-name www \
|
|
148
|
+
--ipv4-address 1.2.3.4
|
|
149
|
+
|
|
150
|
+
# Add CNAME
|
|
151
|
+
az network dns record-set cname set-record \
|
|
152
|
+
--resource-group my-rg \
|
|
153
|
+
--zone-name example.com \
|
|
154
|
+
--record-set-name app \
|
|
155
|
+
--cname my-app.azurewebsites.net
|
|
156
|
+
|
|
157
|
+
# ⚠️ DESTRUCTIVE
|
|
158
|
+
az network dns record-set a remove-record \
|
|
159
|
+
--resource-group my-rg --zone-name example.com \
|
|
160
|
+
--record-set-name www --ipv4-address 1.2.3.4
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Private DNS
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
az network private-dns zone create --resource-group my-rg --name private.example.com
|
|
167
|
+
az network private-dns link vnet create \
|
|
168
|
+
--resource-group my-rg \
|
|
169
|
+
--zone-name private.example.com \
|
|
170
|
+
--name my-link \
|
|
171
|
+
--virtual-network my-vnet \
|
|
172
|
+
--registration-enabled false
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Load Balancer
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# ⚠️ EXPENSIVE — Standard LB ~$18+/month + data processing
|
|
179
|
+
az network lb create \
|
|
180
|
+
--resource-group my-rg \
|
|
181
|
+
--name my-lb \
|
|
182
|
+
--sku Standard \
|
|
183
|
+
--public-ip-address my-ip \
|
|
184
|
+
--frontend-ip-name myFrontEnd \
|
|
185
|
+
--backend-pool-name myBackendPool
|
|
186
|
+
|
|
187
|
+
az network lb list --resource-group my-rg -o json
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Application Gateway
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# ⚠️ EXPENSIVE — ~$20+/month (WAF v2 ~$200+/month)
|
|
194
|
+
az network application-gateway list --resource-group my-rg -o json
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Azure Monitor & Logging
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# Activity log (audit trail)
|
|
201
|
+
az monitor activity-log list --resource-group my-rg --max-events 20 -o json
|
|
202
|
+
|
|
203
|
+
# Metrics
|
|
204
|
+
az monitor metrics list \
|
|
205
|
+
--resource "/subscriptions/SUB_ID/resourceGroups/my-rg/providers/Microsoft.Compute/virtualMachines/my-vm" \
|
|
206
|
+
--metric "Percentage CPU" \
|
|
207
|
+
--interval PT1H -o json
|
|
208
|
+
|
|
209
|
+
# Log Analytics query
|
|
210
|
+
az monitor log-analytics query \
|
|
211
|
+
--workspace WORKSPACE_ID \
|
|
212
|
+
--analytics-query "AzureActivity | take 10" -o json
|
|
213
|
+
|
|
214
|
+
# Alerts
|
|
215
|
+
az monitor metrics alert list --resource-group my-rg -o json
|
|
216
|
+
az monitor metrics alert create \
|
|
217
|
+
--name "high-cpu" \
|
|
218
|
+
--resource-group my-rg \
|
|
219
|
+
--scopes "/subscriptions/SUB_ID/resourceGroups/my-rg/providers/Microsoft.Compute/virtualMachines/my-vm" \
|
|
220
|
+
--condition "avg Percentage CPU > 80" \
|
|
221
|
+
--description "Alert when CPU exceeds 80%"
|
|
222
|
+
```
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Data: SQL Database, Cosmos DB, Service Bus, Event Hubs
|
|
2
|
+
|
|
3
|
+
## Azure SQL Database
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
# Create SQL server (logical server — required before creating databases)
|
|
7
|
+
# ⚠️ Never put password in CLI args — use Key Vault
|
|
8
|
+
ADMIN_PWD=$(az keyvault secret show --vault-name my-vault --name sql-admin-pwd --query value -o tsv)
|
|
9
|
+
|
|
10
|
+
az sql server create \
|
|
11
|
+
--resource-group my-rg \
|
|
12
|
+
--name my-sql-server \
|
|
13
|
+
--location westeurope \
|
|
14
|
+
--admin-user sqladmin \
|
|
15
|
+
--admin-password "$ADMIN_PWD"
|
|
16
|
+
|
|
17
|
+
# ⚠️ EXPENSIVE — create database (~$5-2000+/mo depending on tier)
|
|
18
|
+
az sql db create \
|
|
19
|
+
--resource-group my-rg \
|
|
20
|
+
--server my-sql-server \
|
|
21
|
+
--name my-database \
|
|
22
|
+
--edition GeneralPurpose \
|
|
23
|
+
--compute-model Serverless \
|
|
24
|
+
--family Gen5 \
|
|
25
|
+
--capacity 1 \
|
|
26
|
+
--auto-pause-delay 60
|
|
27
|
+
|
|
28
|
+
# Serverless DTU-based (cheapest for dev/test)
|
|
29
|
+
az sql db create \
|
|
30
|
+
--resource-group my-rg \
|
|
31
|
+
--server my-sql-server \
|
|
32
|
+
--name my-database \
|
|
33
|
+
--edition Basic \
|
|
34
|
+
--capacity 5
|
|
35
|
+
|
|
36
|
+
# READ
|
|
37
|
+
az sql server list --resource-group my-rg -o json
|
|
38
|
+
az sql db list --server my-sql-server --resource-group my-rg -o table
|
|
39
|
+
az sql db show --name my-database --server my-sql-server --resource-group my-rg -o json
|
|
40
|
+
|
|
41
|
+
# Firewall rules
|
|
42
|
+
# ⚠️ SECURITY — allow Azure services
|
|
43
|
+
az sql server firewall-rule create \
|
|
44
|
+
--resource-group my-rg \
|
|
45
|
+
--server my-sql-server \
|
|
46
|
+
--name AllowAzureServices \
|
|
47
|
+
--start-ip-address 0.0.0.0 \
|
|
48
|
+
--end-ip-address 0.0.0.0
|
|
49
|
+
|
|
50
|
+
# ⚠️ SECURITY — allow specific IP
|
|
51
|
+
az sql server firewall-rule create \
|
|
52
|
+
--resource-group my-rg \
|
|
53
|
+
--server my-sql-server \
|
|
54
|
+
--name my-ip \
|
|
55
|
+
--start-ip-address 1.2.3.4 \
|
|
56
|
+
--end-ip-address 1.2.3.4
|
|
57
|
+
|
|
58
|
+
az sql server firewall-rule list --server my-sql-server --resource-group my-rg -o table
|
|
59
|
+
|
|
60
|
+
# Connection string
|
|
61
|
+
echo "Server=tcp:my-sql-server.database.windows.net,1433;Database=my-database;User ID=sqladmin;Password=...;Encrypt=yes"
|
|
62
|
+
|
|
63
|
+
# ⚠️ DESTRUCTIVE
|
|
64
|
+
az sql db delete --name my-database --server my-sql-server --resource-group my-rg
|
|
65
|
+
az sql server delete --name my-sql-server --resource-group my-rg
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### SQL Database Pricing
|
|
69
|
+
|
|
70
|
+
| Edition | ~Cost/mo | Notes |
|
|
71
|
+
|---------|----------|-------|
|
|
72
|
+
| Basic (5 DTU) | ~$5 | Dev/test |
|
|
73
|
+
| Standard (S0) | ~$15 | Small workloads |
|
|
74
|
+
| GP Serverless vCore | ~$0.50/hr (auto-pause) | Auto-pause saves cost |
|
|
75
|
+
| Business Critical | ~$400+ | High IOPS, readable secondary |
|
|
76
|
+
|
|
77
|
+
## Azure Database for PostgreSQL (Flexible Server)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# ⚠️ EXPENSIVE
|
|
81
|
+
az postgres flexible-server create \
|
|
82
|
+
--resource-group my-rg \
|
|
83
|
+
--name my-pg-server \
|
|
84
|
+
--location westeurope \
|
|
85
|
+
--admin-user pgadmin \
|
|
86
|
+
--admin-password "$ADMIN_PWD" \
|
|
87
|
+
--sku-name Standard_B1ms \
|
|
88
|
+
--tier Burstable \
|
|
89
|
+
--storage-size 32
|
|
90
|
+
|
|
91
|
+
# Create database
|
|
92
|
+
az postgres flexible-server db create \
|
|
93
|
+
--resource-group my-rg \
|
|
94
|
+
--server-name my-pg-server \
|
|
95
|
+
--database-name mydb
|
|
96
|
+
|
|
97
|
+
# READ
|
|
98
|
+
az postgres flexible-server list --resource-group my-rg -o table
|
|
99
|
+
az postgres flexible-server show --name my-pg-server --resource-group my-rg -o json
|
|
100
|
+
az postgres flexible-server db list --resource-group my-rg --server-name my-pg-server -o table
|
|
101
|
+
|
|
102
|
+
# Firewall
|
|
103
|
+
az postgres flexible-server firewall-rule create \
|
|
104
|
+
--resource-group my-rg \
|
|
105
|
+
--name my-pg-server \
|
|
106
|
+
--rule-name allow-my-ip \
|
|
107
|
+
--start-ip-address 1.2.3.4 \
|
|
108
|
+
--end-ip-address 1.2.3.4
|
|
109
|
+
|
|
110
|
+
# Connect
|
|
111
|
+
az postgres flexible-server connect --name my-pg-server --admin-user pgadmin --admin-password "$ADMIN_PWD" --database-name mydb
|
|
112
|
+
|
|
113
|
+
# ⚠️ DESTRUCTIVE
|
|
114
|
+
az postgres flexible-server delete --name my-pg-server --resource-group my-rg
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Cosmos DB
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Create account (multi-region, multi-model)
|
|
121
|
+
az cosmosdb create \
|
|
122
|
+
--resource-group my-rg \
|
|
123
|
+
--name my-cosmos \
|
|
124
|
+
--kind GlobalDocumentDB \
|
|
125
|
+
--locations regionName=westeurope failoverPriority=0
|
|
126
|
+
|
|
127
|
+
# Create SQL database (Core/SQL API)
|
|
128
|
+
az cosmosdb sql database create \
|
|
129
|
+
--account-name my-cosmos \
|
|
130
|
+
--resource-group my-rg \
|
|
131
|
+
--name mydb
|
|
132
|
+
|
|
133
|
+
# Create container (collection)
|
|
134
|
+
az cosmosdb sql container create \
|
|
135
|
+
--account-name my-cosmos \
|
|
136
|
+
--resource-group my-rg \
|
|
137
|
+
--database-name mydb \
|
|
138
|
+
--name mycontainer \
|
|
139
|
+
--partition-key-path "/partitionKey" \
|
|
140
|
+
--throughput 400
|
|
141
|
+
|
|
142
|
+
# READ
|
|
143
|
+
az cosmosdb list --resource-group my-rg -o json
|
|
144
|
+
az cosmosdb show --name my-cosmos --resource-group my-rg -o json
|
|
145
|
+
az cosmosdb sql database list --account-name my-cosmos --resource-group my-rg -o table
|
|
146
|
+
|
|
147
|
+
# Get connection keys
|
|
148
|
+
az cosmosdb keys list --name my-cosmos --resource-group my-rg -o json
|
|
149
|
+
|
|
150
|
+
# ⚠️ DESTRUCTIVE
|
|
151
|
+
az cosmosdb sql container delete --account-name my-cosmos --resource-group my-rg --database-name mydb --name mycontainer
|
|
152
|
+
az cosmosdb delete --name my-cosmos --resource-group my-rg
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Service Bus
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Create namespace
|
|
159
|
+
az servicebus namespace create \
|
|
160
|
+
--resource-group my-rg \
|
|
161
|
+
--name my-sb-ns \
|
|
162
|
+
--location westeurope \
|
|
163
|
+
--sku Standard
|
|
164
|
+
|
|
165
|
+
# Queues
|
|
166
|
+
az servicebus queue create --resource-group my-rg --namespace-name my-sb-ns --name my-queue
|
|
167
|
+
az servicebus queue list --resource-group my-rg --namespace-name my-sb-ns -o table
|
|
168
|
+
|
|
169
|
+
# Topics & Subscriptions
|
|
170
|
+
az servicebus topic create --resource-group my-rg --namespace-name my-sb-ns --name my-topic
|
|
171
|
+
az servicebus topic subscription create \
|
|
172
|
+
--resource-group my-rg --namespace-name my-sb-ns \
|
|
173
|
+
--topic-name my-topic --name my-sub
|
|
174
|
+
|
|
175
|
+
# Get connection string
|
|
176
|
+
az servicebus namespace authorization-rule keys list \
|
|
177
|
+
--resource-group my-rg --namespace-name my-sb-ns \
|
|
178
|
+
--name RootManageSharedAccessKey --query primaryConnectionString -o tsv
|
|
179
|
+
|
|
180
|
+
# ⚠️ DESTRUCTIVE
|
|
181
|
+
az servicebus queue delete --resource-group my-rg --namespace-name my-sb-ns --name my-queue
|
|
182
|
+
az servicebus topic delete --resource-group my-rg --namespace-name my-sb-ns --name my-topic
|
|
183
|
+
az servicebus namespace delete --resource-group my-rg --name my-sb-ns
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Event Hubs
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# Create namespace
|
|
190
|
+
az eventhubs namespace create \
|
|
191
|
+
--resource-group my-rg \
|
|
192
|
+
--name my-eh-ns \
|
|
193
|
+
--location westeurope \
|
|
194
|
+
--sku Standard
|
|
195
|
+
|
|
196
|
+
# Create event hub
|
|
197
|
+
az eventhubs eventhub create \
|
|
198
|
+
--resource-group my-rg \
|
|
199
|
+
--namespace-name my-eh-ns \
|
|
200
|
+
--name my-hub \
|
|
201
|
+
--partition-count 4 \
|
|
202
|
+
--message-retention 1
|
|
203
|
+
|
|
204
|
+
# Consumer groups
|
|
205
|
+
az eventhubs eventhub consumer-group create \
|
|
206
|
+
--resource-group my-rg --namespace-name my-eh-ns \
|
|
207
|
+
--eventhub-name my-hub --name my-cg
|
|
208
|
+
|
|
209
|
+
# READ
|
|
210
|
+
az eventhubs eventhub list --resource-group my-rg --namespace-name my-eh-ns -o table
|
|
211
|
+
|
|
212
|
+
# Get connection string
|
|
213
|
+
az eventhubs namespace authorization-rule keys list \
|
|
214
|
+
--resource-group my-rg --namespace-name my-eh-ns \
|
|
215
|
+
--name RootManageSharedAccessKey --query primaryConnectionString -o tsv
|
|
216
|
+
|
|
217
|
+
# ⚠️ DESTRUCTIVE
|
|
218
|
+
az eventhubs eventhub delete --resource-group my-rg --namespace-name my-eh-ns --name my-hub
|
|
219
|
+
az eventhubs namespace delete --resource-group my-rg --name my-eh-ns
|
|
220
|
+
```
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# IAM, Resources & Key Vault
|
|
2
|
+
|
|
3
|
+
## Resource Groups
|
|
4
|
+
|
|
5
|
+
Resource groups are the fundamental container for all Azure resources.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# CREATE
|
|
9
|
+
az group create --name my-rg --location westeurope
|
|
10
|
+
|
|
11
|
+
# READ
|
|
12
|
+
az group list -o json
|
|
13
|
+
az group show --name my-rg -o json
|
|
14
|
+
az group exists --name my-rg # returns true/false
|
|
15
|
+
|
|
16
|
+
# List resources in a group
|
|
17
|
+
az resource list --resource-group my-rg -o table
|
|
18
|
+
|
|
19
|
+
# ⚠️ DESTRUCTIVE — deletes ALL resources inside the group
|
|
20
|
+
az group delete --name my-rg
|
|
21
|
+
|
|
22
|
+
# Tags
|
|
23
|
+
az group update --name my-rg --tags env=dev team=backend
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## RBAC (Role-Based Access Control)
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# List role assignments on a resource group
|
|
30
|
+
az role assignment list --resource-group my-rg -o json
|
|
31
|
+
|
|
32
|
+
# List role assignments for a specific user/SP
|
|
33
|
+
az role assignment list --assignee user@example.com -o json
|
|
34
|
+
|
|
35
|
+
# WRITE — grant role (confirm with user)
|
|
36
|
+
az role assignment create \
|
|
37
|
+
--assignee user@example.com \
|
|
38
|
+
--role "Contributor" \
|
|
39
|
+
--scope /subscriptions/SUB_ID/resourceGroups/my-rg
|
|
40
|
+
|
|
41
|
+
# Grant role to service principal
|
|
42
|
+
az role assignment create \
|
|
43
|
+
--assignee SP_APP_ID \
|
|
44
|
+
--role "Reader" \
|
|
45
|
+
--scope /subscriptions/SUB_ID/resourceGroups/my-rg
|
|
46
|
+
|
|
47
|
+
# ⚠️ DESTRUCTIVE — remove role
|
|
48
|
+
az role assignment delete \
|
|
49
|
+
--assignee user@example.com \
|
|
50
|
+
--role "Contributor" \
|
|
51
|
+
--scope /subscriptions/SUB_ID/resourceGroups/my-rg
|
|
52
|
+
|
|
53
|
+
# List available role definitions
|
|
54
|
+
az role definition list --query "[].{Name:roleName, Description:description}" -o table
|
|
55
|
+
az role definition list --name "Contributor" -o json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
> **Least privilege**: Prefer specific roles (e.g., `Storage Blob Data Reader`)
|
|
59
|
+
> over broad ones (`Contributor`, `Owner`). Never grant `Owner` to automation.
|
|
60
|
+
|
|
61
|
+
### Common Built-in Roles
|
|
62
|
+
|
|
63
|
+
| Role | Scope |
|
|
64
|
+
|------|-------|
|
|
65
|
+
| `Reader` | View all resources, no changes |
|
|
66
|
+
| `Contributor` | Manage all resources, no RBAC/policy changes |
|
|
67
|
+
| `Owner` | Full access including RBAC |
|
|
68
|
+
| `Storage Blob Data Contributor` | Read/write/delete blobs |
|
|
69
|
+
| `Key Vault Secrets User` | Read secrets |
|
|
70
|
+
| `AcrPush` | Push images to Container Registry |
|
|
71
|
+
| `Website Contributor` | Manage web apps |
|
|
72
|
+
|
|
73
|
+
## Entra ID (Azure AD)
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Users
|
|
77
|
+
az ad user list --query "[].{Name:displayName, UPN:userPrincipalName}" -o table
|
|
78
|
+
az ad user show --id user@example.com -o json
|
|
79
|
+
|
|
80
|
+
# Service Principals
|
|
81
|
+
az ad sp list --display-name "my-sp" -o json
|
|
82
|
+
az ad sp show --id SP_APP_ID -o json
|
|
83
|
+
|
|
84
|
+
# App Registrations
|
|
85
|
+
az ad app list --display-name "my-app" -o json
|
|
86
|
+
az ad app show --id APP_ID -o json
|
|
87
|
+
|
|
88
|
+
# Create app registration
|
|
89
|
+
az ad app create --display-name "my-app"
|
|
90
|
+
|
|
91
|
+
# Create service principal for the app
|
|
92
|
+
az ad sp create --id APP_ID
|
|
93
|
+
|
|
94
|
+
# ⚠️ SECURITY — create client secret (shown only once)
|
|
95
|
+
az ad app credential reset --id APP_ID --append
|
|
96
|
+
|
|
97
|
+
# Groups
|
|
98
|
+
az ad group list -o table
|
|
99
|
+
az ad group member list --group "My Group" -o table
|
|
100
|
+
az ad group member add --group "My Group" --member-id USER_OBJECT_ID
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
> ⚠️ **FORBIDDEN**: Do not use `az ad app credential reset` with `--password`
|
|
104
|
+
> plaintext argument. Always let Azure generate the secret or use certificates.
|
|
105
|
+
|
|
106
|
+
## Key Vault
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Create vault
|
|
110
|
+
az keyvault create --name my-vault --resource-group my-rg --location westeurope
|
|
111
|
+
|
|
112
|
+
# READ
|
|
113
|
+
az keyvault list -o json
|
|
114
|
+
az keyvault show --name my-vault -o json
|
|
115
|
+
|
|
116
|
+
# --- Secrets ---
|
|
117
|
+
# Set secret (pipe or use --file, avoid plaintext in CLI args)
|
|
118
|
+
az keyvault secret set --vault-name my-vault --name my-secret --value "$(cat secret.txt)"
|
|
119
|
+
|
|
120
|
+
# Get secret value
|
|
121
|
+
az keyvault secret show --vault-name my-vault --name my-secret --query value -o tsv
|
|
122
|
+
|
|
123
|
+
# List secrets
|
|
124
|
+
az keyvault secret list --vault-name my-vault -o table
|
|
125
|
+
|
|
126
|
+
# New version (just set again — versions are automatic)
|
|
127
|
+
az keyvault secret set --vault-name my-vault --name my-secret --value "new-value"
|
|
128
|
+
|
|
129
|
+
# ⚠️ DESTRUCTIVE — soft-delete (recoverable)
|
|
130
|
+
az keyvault secret delete --vault-name my-vault --name my-secret
|
|
131
|
+
|
|
132
|
+
# ⚠️ DESTRUCTIVE — purge (permanent, not recoverable)
|
|
133
|
+
az keyvault secret purge --vault-name my-vault --name my-secret
|
|
134
|
+
|
|
135
|
+
# --- Keys ---
|
|
136
|
+
az keyvault key create --vault-name my-vault --name my-key --kty RSA --size 2048
|
|
137
|
+
az keyvault key list --vault-name my-vault -o json
|
|
138
|
+
|
|
139
|
+
# --- Certificates ---
|
|
140
|
+
az keyvault certificate create --vault-name my-vault --name my-cert --policy @policy.json
|
|
141
|
+
az keyvault certificate list --vault-name my-vault -o json
|
|
142
|
+
|
|
143
|
+
# --- Access Policies ---
|
|
144
|
+
# Grant access to a service principal
|
|
145
|
+
az keyvault set-policy --name my-vault \
|
|
146
|
+
--spn SP_APP_ID \
|
|
147
|
+
--secret-permissions get list
|
|
148
|
+
|
|
149
|
+
# Grant access to a user
|
|
150
|
+
az keyvault set-policy --name my-vault \
|
|
151
|
+
--upn user@example.com \
|
|
152
|
+
--secret-permissions get list set delete
|
|
153
|
+
|
|
154
|
+
# ⚠️ DESTRUCTIVE — delete vault
|
|
155
|
+
az keyvault delete --name my-vault --resource-group my-rg
|
|
156
|
+
az keyvault purge --name my-vault --location westeurope # permanent
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Resource Locks
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Prevent accidental deletion
|
|
163
|
+
az lock create --name no-delete --resource-group my-rg --lock-type CanNotDelete
|
|
164
|
+
|
|
165
|
+
# Prevent any changes
|
|
166
|
+
az lock create --name read-only --resource-group my-rg --lock-type ReadOnly
|
|
167
|
+
|
|
168
|
+
# List & remove
|
|
169
|
+
az lock list --resource-group my-rg -o table
|
|
170
|
+
az lock delete --name no-delete --resource-group my-rg
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Resource Providers
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# List registered providers
|
|
177
|
+
az provider list --query "[?registrationState=='Registered'].namespace" -o tsv
|
|
178
|
+
|
|
179
|
+
# Check specific provider
|
|
180
|
+
az provider show --namespace Microsoft.ContainerApp --query registrationState -o tsv
|
|
181
|
+
|
|
182
|
+
# Register (required before first use of some services)
|
|
183
|
+
az provider register --namespace Microsoft.ContainerApp --wait
|
|
184
|
+
```
|