GCP · Your First Cloud Storage Lab
Use the Google Cloud CLI environment for a safe storage lifecycle with explicit cleanup.
What you'll build
Before You Build
2 quick questions. This is diagnostic only — it does not block the lesson.
What must be confirmed before creating Google Cloud resources?
Why use a unique resource name?
Mission
Use a GCS-compatible emulator and the isolated Google Cloud CLI container to complete one local Cloud Storage lifecycle, see it in the ENJYRA console, and prove cleanup.
LOCAL GCP SIMULATION · NO CLOUD ACCOUNT
This lab runs only in lesson-scoped Docker containers on your machine. The console and CLI use a GCS-compatible emulator, not the Google Cloud Console, and no billable project is created.
Understand
The local emulator provides the Cloud Storage JSON API, while the ENJYRA console reads its real bucket and object state. The target lifecycle remains: create bucket → upload → list → download → delete object → delete bucket. The concepts transfer to GCP, but not every provider feature is reproduced.
Build
You will launch the GCP Local Lab, create a bucket through the same wizard a real Google Cloud console mirrors (access control, an IAM role, a Security Review), upload and inspect an object, and confirm the Activity Log. Unlike AWS’s Public Access Block, this local emulator cannot actually enforce bucket access — the lesson is honest about that the whole way through.
Start the local GCS-compatible emulator and the official ENJYRA GCP console for this lesson only.
Every later step reads and writes the same emulator state the console shows you.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp start./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp start.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp startBefore You Run
- Your terminal is open in enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Starts the local GCS-compatible emulator and the official ENJYRA GCP console container, both scoped to this lesson.
Command Breakdown
ENJYRA launcher · GCP · start- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its start action.
Expected Result
ENJYRA gcp local lab is starting.
Console: http://localhost:8083What Changed
BeforeThe requested local service or lab containers are not yet confirmed running.
AfterThe local service or lab containers are running in the background and can be verified.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Both the emulator and ENJYRA console should report healthy.
If It Fails
- Run the status command below. If the console is not healthy, check that Docker Desktop is running.
What this command does Starts the local GCS-compatible emulator and the official ENJYRA GCP console container, both scoped to this lesson.
ENJYRA gcp local lab is starting.
Console: http://localhost:8083If it fails
Run the status command below. If the console is not healthy, check that Docker Desktop is running.
Open http://localhost:8083 and confirm the header shows ✓ Official ENJYRA Lab and ● Running locally. This is the ENJYRA GCP Local Lab, not the real Google Cloud console.
What’s happening behind the scenes?
Official ENJYRA image: enjyra/gcp-labs · Release: console-0.1.1 · Platforms: linux/amd64, linux/arm64. Docker Compose reads compose/gcp.compose.yml, pulls this image plus the upstream GCS-compatible emulator, and starts both.
The GCP Local Lab console becomes reachable at http://localhost:8083. Docker Compose pulls the official enjyra/gcp-labs image automatically — you do not need to run docker pull yourself.
Confirm both containers are healthy before continuing.
Catching a startup problem here is easier than debugging it three steps later.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp statusBefore You Run
- Your terminal is open in enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Lists the two containers for this lab and their health.
Command Breakdown
ENJYRA launcher · GCP · status- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its status action.
Expected Result
enjyra-gcp-b03 Up (healthy)
enjyra-gcp-b03-console Up (healthy)What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Run the command and compare its output with the Expected Result block.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Lists the two containers for this lab and their health.
enjyra-gcp-b03 Up (healthy)
enjyra-gcp-b03-console Up (healthy)Nothing — this only reads status.
Decide the bucket's name, location type, and location before creating it.
Real GCS bucket names are globally unique, and a Region, Dual-region, or Multi-region is a deliberate durability and latency choice.
Bucket name: enjyra-gcp-documents-dev
Project: enjyra-local-project (this lab’s local context)
Location type: Region
Location: Iowa — us-central1
Use Buckets → Create Bucket, choose a Location type and provider-correct Location, then check Object Versioning, 7-day Soft Delete, access controls, and IAM before creating.
Planning location, recovery, access, and ownership before creation is the same discipline a real GCP engineer follows.
Console path: Buckets → Create Bucket → General → Location type Region → Location Iowa — us-central1 → Access control → Data Protection → keep Object versioning and Soft Delete enabled with 7 days → IAM → choose Storage Object Admin → Review + create.
The same Location type control also offers provider-correct Dual-region choices such as NAM4 and Multi-region choices US, EU, and ASIA. Keep Region → Iowa for this walkthrough.
On the Review step, ENJYRA shows a live Security Review calculated from your actual choices. If you disable Uniform bucket-level access or Public access prevention during the wizard, you will see an inline ⚠ warning immediately.
LOCAL LAB NOTE
The Google Cloud location is educational configuration stored as emulator metadata. The bucket’s bytes still run on your machine; selecting Iowa, London, Mumbai, a dual-region, or a multi-region does not move local data there.
Access control here is a learning simulation, not an enforced local setting
This local emulator accepts a bucket’s access-control request but does not actually enforce Uniform bucket-level access or Public access prevention — ENJYRA verified this by reading the setting back after saving it. The console labels this ◐ SIMULATED rather than claiming it as ● LIVE LOCAL. It still shows you the same warning a real misconfiguration would, because the concept — and the risk — transfers directly to the real Google Cloud console, even though this local lab cannot enforce it.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp cli buckets create gs://enjyra-gcp-documents-dev --location=us-central1./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp cli buckets create gs://enjyra-gcp-documents-dev --location=us-central1.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp cli buckets create gs://enjyra-gcp-documents-dev --location=us-central1Before You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Creates the same bucket directly against the local emulator.
Command Breakdown
ENJYRA launcher · GCP · cli- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its cli action.
Expected Result
Creating gs://enjyra-gcp-documents-dev/…What Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Creates the same bucket directly against the local emulator.
Creating gs://enjyra-gcp-documents-dev/…A real bucket is created with live emulator location metadata. Generation and soft-delete recovery remain clearly labelled learning simulations.
Click the bucket's name in Buckets to open its own page.
A real console does not keep you on the list — each bucket has its own Objects, Configuration, Permissions and Activity views.
Console path: Buckets → enjyra-gcp-documents-dev → Configuration tab.
Confirm Location type reads region, Location reads Iowa — us-central1, and the object count is read live from the emulator.
Nothing is created here; this reads the bucket's real state.
Create a small text file and upload it to the bucket, from the console.
Objects are what a bucket actually stores; uploading proves the bucket is usable, not just present.
mkdir -p compose/workspace/gcp
printf "Hello ENJYRA\n" > compose/workspace/gcp/enjyra-demo.txtmkdir -p compose/workspace/gcp
printf "Hello ENJYRA\n" > compose/workspace/gcp/enjyra-demo.txtNew-Item -ItemType Directory -Force -Path "compose\workspace\gcp" | Out-Null
Set-Content -Path "compose\workspace\gcp\enjyra-demo.txt" -Value "Hello ENJYRA"Before You Run
- Your terminal is open in enjyra-cloud-labs.
Why You're Running This
Creates the workspace folder if needed, then writes a one-line text file for this lesson.
Command Breakdown
mkdir -p / New-Item Directory- Creates the requested folder and any missing parent folders without failing when it already exists.
printf / Set-Content- Writes the specified text into the target file, replacing its previous contents when it already exists.
Expected Result
compose/workspace/gcp/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.What Changed
Beforecompose/workspace/gcp/enjyra-demo.txt may not exist yet, or may still contain its previous content.
Aftercompose/workspace/gcp/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.
Verify It
macOSls -l compose/workspace/gcp/enjyra-demo.txt
Linuxls -l compose/workspace/gcp/enjyra-demo.txt
Windows PowerShellGet-Item "compose\workspace\gcp\enjyra-demo.txt"
Confirm the file exists at the expected path.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
What this command does Creates the workspace folder if needed, then writes a one-line text file for this lesson.
Console path: Bucket detail → Objects tab → Upload object → choose enjyra-demo.txt.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/Before You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Uploads the same file directly through the gcloud CLI.
Command Breakdown
ENJYRA launcher · GCP · cli- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its cli action.
Expected Result
Completed files 1/1What Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Uploads the same file directly through the gcloud CLI.
Completed files 1/1Whichever path you use, refresh the other: the CLI and the console Objects tab both read the same bucket.
enjyra-demo.txt now exists inside enjyra-gcp-documents-dev.
On the Permissions tab, compare Uniform and fine-grained access, Public Access Prevention states, and IAM roles in the learning evaluator.
Even though this local lab cannot enforce these settings, the console shows deterministic allow/deny outcomes and the same warning a real misconfiguration would — practising when to raise it matters as much as the click.
Console path: Bucket detail → Permissions tab → choose an Access mode and Public Access Prevention state → Save learning state. Select allUsers while prevention is Enforced and evaluate Read: expect DENY.
Then choose [email protected], assign Storage Object Admin, and evaluate Upload: expect ALLOW. Every control remains labelled ◐ LEARNING SIMULATION because independent read-back proved this emulator does not persist or enforce it.
The console's stored, unenforced learning state and IAM binding change; the real emulator's bucket access is not altered.
Overwrite enjyra-demo.txt, inspect its LIVE and NONCURRENT generations, delete the live object, then restore it from Soft-deleted.
Google Cloud Object Versioning retains noncurrent generations, and Soft Delete provides a separate recovery window.
printf "Hello ENJYRA generation 2\n" > compose/workspace/gcp/enjyra-demo.txt
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/printf "Hello ENJYRA generation 2\n" > compose/workspace/gcp/enjyra-demo.txt
./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/Set-Content -Path "compose\workspace\gcp\enjyra-demo.txt" -Value "Hello ENJYRA generation 2"
.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/Before You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Overwrites the live emulator object; ENJYRA records the earlier content as a simulated NONCURRENT generation.
Command Breakdown
printf / Set-Content- Writes the specified text into the target file, replacing its previous contents when it already exists.
ENJYRA launcher · GCP · cli- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its cli action.
Expected Result
compose/workspace/gcp/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.What Changed
Beforecompose/workspace/gcp/enjyra-demo.txt may not exist yet, or may still contain its previous content.
Aftercompose/workspace/gcp/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.
Verify It
macOSls -l compose/workspace/gcp/enjyra-demo.txt
Linuxls -l compose/workspace/gcp/enjyra-demo.txt
Windows PowerShellGet-Item "compose\workspace\gcp\enjyra-demo.txt"
Confirm the file exists at the expected path.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Overwrites the live emulator object; ENJYRA records the earlier content as a simulated NONCURRENT generation.
Console path: Bucket detail → Versions → confirm LIVE and NONCURRENT → Objects → Delete → Soft-deleted → confirm the 7-day recovery deadline → Restore.
The object returns as a new LIVE generation and the original history remains visible. Protection and generation identifiers remain marked ◐ LEARNING SIMULATION because fake-gcs-server does not prove the complete provider recovery API.
The restored content is uploaded back to the real emulator as a new live object, while ENJYRA's clearly labelled generation history preserves the earlier and soft-deleted states.
Open Activity Log from the sidebar and find the bucket, object, permission, and simulated recovery events you just caused.
The Activity Log distinguishes real emulator state changes from console-side learning actions.
Confirm the log contains: bucket created, location selected, object uploaded, new generation created, object soft-deleted with its recovery window, and object restored with a new live generation. Permission/IAM changes appear as console-side learning actions.
Nothing — this only reads the log.
Break
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp cli buckets create gs://INVALID_NAME./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp cli buckets create gs://INVALID_NAME.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp cli buckets create gs://INVALID_NAMEBefore You Run
- Your terminal is open in Current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
This creates or updates the resource in the same local emulator displayed by the ENJYRA console.
Command Breakdown
ENJYRA launcher · GCP · cli- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its cli action.
Expected Result
invalid bucket name
A deliberately invalid bucket name produces an understandable local storage error.What Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
invalid bucket nameIf it fails
command not found → verify the required tool is installed and reopen the terminal.No such file or directory → check your current folder with pwd or Get-Location.Permission denied → confirm the lesson workspace is writable.Debug
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp logs./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp logs.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp logsBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Checks status, then prints logs for only the GCP local lab. The wrapper disables credentials and overrides only the local storage endpoint.
Command Breakdown
ENJYRA launcher · GCP · status- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its status action.
ENJYRA launcher · GCP · logs- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its logs action.
Expected Result
No persistent state changed; the command printed evidence you can compare with the expected result.What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp logs
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp logs
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp logs
Run the command and compare its output with the Expected Result block.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Checks status, then prints logs for only the GCP local lab. The wrapper disables credentials and overrides only the local storage endpoint.
Improve
Add a second object under a folder-style prefix, entirely through the CLI this time, then confirm the console Objects tab agrees without a manual reload.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/notes/readme.txt./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/notes/readme.txt.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp cli cp /workspace/files/enjyra-demo.txt gs://enjyra-gcp-documents-dev/notes/readme.txtBefore You Run
- Your terminal is open in Current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
This creates or updates the resource in the same local emulator displayed by the ENJYRA console.
Command Breakdown
ENJYRA launcher · GCP · cli- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its cli action.
Expected Result
Completed files 1/1
notes/readme.txt appears in the console's Objects tab within a few seconds — the console polls the emulator, it does not require a page reload.What Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
Completed files 1/1If it fails
command not found → verify the required tool is installed and reopen the terminal.No such file or directory → check your current folder with pwd or Get-Location.Permission denied → confirm the lesson workspace is writable.Verify
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp cli ls 'gs://enjyra-gcp-documents-dev/**'./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp cli ls 'gs://enjyra-gcp-documents-dev/**'.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp cli ls "gs://enjyra-gcp-documents-dev/**"Before You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Lists both objects so you can compare the CLI output with the console's Objects tab and object count.
Command Breakdown
ENJYRA launcher · GCP · cli- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its cli action.
Expected Result
No persistent state changed; the command printed evidence you can compare with the expected result.What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp cli ls 'gs://enjyra-gcp-documents-dev/**'
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp cli ls 'gs://enjyra-gcp-documents-dev/**'
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp cli ls "gs://enjyra-gcp-documents-dev/**"
Run the command and compare its output with the Expected Result block.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Lists both objects so you can compare the CLI output with the console's Objects tab and object count.
Challenge
Delete both objects, then delete the bucket, then refresh the console and confirm the resource count returns to zero. The Reset lab button performs the same lesson-scoped cleanup safely and also clears generation history, soft-deleted recovery state, and bucket location/protection learning metadata.
Ship
LOCAL_EMULATOR_PASS when the GCS-compatible emulator is healthy, the bucket and object appear in the console, the deliberate failure is clear, and cleanup is verified.
Next Step
Return to the bonus lab list. Each cloud lab is optional and independent of the 9 / 9 core completion.
Prepare Your Machine
Open only the setup step you need. Complete every verification before moving into Build.
This lesson needs
Install Docker Desktop / Engine (full walkthrough)
- Check your Mac's chip architecture (Apple Silicon vs Intel) before downloading.COMMAND
uname -mExpected output"arm64" (Apple Silicon) or "x86_64" (Intel)If error
If nothing prints, open Terminal from Applications → Utilities and try again.
- Download Docker Desktop for your chip from docs.docker.com/desktop/setup/install/mac-install and open the downloaded
.dmg, then drag Docker to Applications. - Launch Docker Desktop from Applications and wait for the whale icon in the menu bar to show "Docker Desktop is running".
- Verify the CLI is installed.COMMAND
docker --versionExpected outputDocker version 2x.x.x, build xxxxxxxIf error
If “command not found”, reopen Terminal after installing so your PATH refreshes, or reinstall Docker Desktop.
- Verify the engine is actually running (not just installed).COMMAND
docker infoExpected outputA block of server information, including Server Version and ContainersIf error
If it says “Cannot connect to the Docker daemon”, open Docker Desktop and wait for the whale icon to stop animating.
- Run a real test container end-to-end.COMMAND
docker run --rm hello-worldExpected output"Hello from Docker!" followed by an explanation of what happenedIf error
If the image can't be pulled, check your internet connection; this is the only step that needs it.
- Download Docker Desktop for Windows from docs.docker.com/desktop/setup/install/windows-install and run the installer. Docker Desktop will guide you through any compatible Windows backend requirement; this lesson does not require a WSL terminal.
- If the installer asks you to enable a Windows feature or restart, follow that prompt and finish the Docker Desktop setup before continuing.
- Start Docker Desktop from the Start menu and wait for the whale icon in the system tray to report "Docker Desktop is running".
- Verify the CLI, using PowerShell or the built-in VS Code terminal (not a Bash-syntax terminal).COMMAND
docker --versionExpected outputDocker version 2x.x.x, build xxxxxxxIf error
If “not recognized”, close and reopen your terminal so PATH changes take effect.
- Verify the engine is running.COMMAND
docker infoExpected outputA block of server information, including Server Version and ContainersIf error
If it can't connect to the daemon, open Docker Desktop, wait until it reports Running, and review Docker Desktop's own Troubleshoot panel.
- Run a real test container.COMMAND
docker run --rm hello-worldExpected output"Hello from Docker!" followed by an explanation of what happenedIf error
If the pull hangs, check your internet connection and that Docker Desktop shows as running, not starting.
- Prefer Docker Engine (not Docker Desktop) on Linux. Follow the official instructions for your distribution at docs.docker.com/engine/install — for Ubuntu specifically, use docs.docker.com/engine/install/ubuntu.
- Start and enable the Docker service.COMMAND
sudo systemctl enable --now dockerExpected outputNo output on successIf error
If systemctl isn't available, your distro may use a different init system — check its Docker Engine install page.
- Confirm the service is active.COMMAND
systemctl status dockerExpected outputActive: active (running)If error
If it shows “inactive” or “failed”, re-run the enable command above and check the install steps were completed.
- Verify the CLI.COMMAND
docker --versionExpected outputDocker version 2x.x.x, build xxxxxxxIf error
If “command not found”, the Engine install likely didn't finish — re-check the distro-specific install page.
- Verify the engine responds.COMMAND
docker infoExpected outputA block of server information, including Server Version and ContainersIf error
A permission-denied error here usually means your user isn't in the docker group yet — see the note below rather than running commands as root.
- Run a real test container.COMMAND
docker run --rm hello-worldExpected output"Hello from Docker!" followed by an explanation of what happenedIf error
If you see a permission error, add your user to the docker group yourself (sudo usermod -aG docker $USER, then log out and back in) — we won't do this for you automatically.
Note: running Docker commands as root or with a global chmod on the socket is not recommended. Add your user to the docker group instead, as shown above.
Before You Run
Install Docker Desktop on macOS or Windows, or Docker Engine/Desktop using the official instructions for your Linux distribution. Start Docker and open Terminal or native Windows PowerShell.
Why Do We Need Docker?
The ENJYRA AWS, Azure, and GCP labs run locally inside Docker containers. No real AWS, Azure, or GCP account is required.
Command Breakdown
docker --version- Confirms the Docker command-line client is installed.
docker info- Asks the Docker Engine for server information, proving it is running and reachable.
docker run --rm hello-world- Runs a small official test container end to end and removes it when finished.
Expected Result
Docker version 2x.x.x
docker info: server details
Hello from Docker!What Changed
BeforeDocker is not yet confirmed.
AfterDocker CLI and Docker Engine are available to launch the local lab.
Verify It
macOSdocker --version
docker info
Linuxdocker --version
docker info
Windows PowerShelldocker --version
docker info
If It Fails
- Open Docker Desktop or start Docker Engine, wait until it reports running, and retry.
- Open a new terminal after installation so PATH changes are loaded.
- On Linux, follow the official instructions for your distribution rather than assuming Ubuntu commands apply.
Install this once — later lessons that need Python will only ask you to verify it.
Official download: python.org/downloads
- Open python.org/downloads and download the current Python 3 installer for macOS, if Python 3 isn't already available.
- Run the installer, then open a new Terminal window (existing ones won't see the update).
- Verify.COMMAND
python3 --versionExpected outputPython 3.x.xIf error
If “command not found”, reopen Terminal, or check the installer actually completed.
- Open python.org/downloads and download Python 3 for Windows.
- Run the installer. When offered, enable "Add Python to PATH" — this step is easy to miss.
- Open a new PowerShell window and verify.COMMAND
py --versionExpected outputPython 3.x.xIf error
If py isn't found, try python --version instead — installers vary in which launcher they register.
- Many Linux distributions already include Python 3 — check first.COMMAND
python3 --versionExpected outputPython 3.x.xIf error
If not found, install Python 3 through your distribution's own package manager or documentation — this varies by distro, so there's no single command here.
- If it's missing, see python.org/downloads for the official source and platform-specific guidance.
Before You Run
Complete the installation instructions for your operating system, then open a new Terminal or native Windows PowerShell window.
Why You're Running This
Python is used by ENJYRA learning utilities, scripts, and exercises.
Command Breakdown
python3 --version / py --version- Asks the installed Python launcher to print its version without running a program.
Expected Result
Python 3.x.xWhat Changed
BeforePython 3 is not yet confirmed on this machine.
AfterA supported Python 3 launcher is available in Terminal or native Windows PowerShell.
Verify It
macOSpython3 --version
Linuxpython3 --version
Windows PowerShellpy --version (fallback: python --version)
If It Fails
Open a new terminal after installation. On Windows, confirm “Add Python to PATH” was selected, then try py or python.
Official download: git-scm.com/downloads
- Visit git-scm.com/downloads and follow the macOS installer, or check whether it's already installed.
- Verify.COMMAND
git --versionExpected outputgit version 2.x.xIf error
macOS may prompt to install Xcode Command Line Tools the first time you run git — accept that prompt, then try again.
- Download Git for Windows from git-scm.com/install/windows and run the installer, keeping the default options.
- Open a new PowerShell window and verify.COMMAND
git --versionExpected outputgit version 2.x.xIf error
Reopen PowerShell so it picks up the updated PATH.
- Git is often preinstalled; check first with the command below. If missing, see git-scm.com/downloads for your distribution's official install method — this is not the same command on every distro.
- Verify.COMMAND
git --versionExpected outputgit version 2.x.xIf error
If git is missing, install it using your distribution's official package manager instructions, then open a new terminal.
Before You Run
Complete the installation instructions for your operating system, then open a new Terminal or native Windows PowerShell window.
Why You're Running This
Git is needed to download the official ENJYRA Cloud Labs repository and work with version-controlled lesson files.
Command Breakdown
git --version- Asks Git to print its installed version without changing any files.
Expected Result
git version 2.x.xWhat Changed
BeforeGit is not yet confirmed on this machine.
AfterGit is available to clone https://github.com/gudshuis/enjyra-cloud-labs.
Verify It
macOSgit --version
Linuxgit --version
Windows PowerShellgit --version
If It Fails
Open a new terminal after installation so the updated PATH is loaded, then retry.
Official download: code.visualstudio.com/download
- Download from code.visualstudio.com/download, unzip, and drag VS Code to Applications.
- Open VS Code once to confirm it launches.
- Optional — verify the
codeshell command, if you want it (not required):COMMANDcode --versionExpected outputA version number, e.g. 1.9x.xIf error
The code command is often not installed by default. In VS Code, open the Command Palette and run “Shell Command: Install 'code' command in PATH” — or just confirm VS Code opens instead, below.
- Download from code.visualstudio.com/download and run the installer.
- Open VS Code once to confirm it launches.
- Optional — verify the
codeshell command:COMMANDcode --versionExpected outputA version number, e.g. 1.9x.xIf error
The Windows installer usually adds this automatically; if not, confirm VS Code opens instead, below.
- Download the package for your distribution from code.visualstudio.com/download and install it using your distribution's normal method.
- Open VS Code once to confirm it launches.
- Optional — verify the
codeshell command:COMMANDcode --versionExpected outputA version number, e.g. 1.9x.xIf error
The code command may not be linked automatically on Linux; confirming VS Code opens is enough for this lesson.
Before You Run
Complete the installation instructions for your operating system, then open a new Terminal or native Windows PowerShell window.
Why You're Running This
Visual Studio Code is used to inspect and edit learner files when a lesson requires it.
Command Breakdown
code --version (optional)- Checks the optional VS Code shell command. Readiness depends on the app opening, not on this command being installed.
Expected Result
VS Code opens successfully; code --version may also print a version number.What Changed
BeforeVisual Studio Code is not yet confirmed on this machine.
AfterVisual Studio Code opens and can be used for lesson files; the code command remains optional.
Verify It
macOSOpen Visual Studio Code
LinuxOpen Visual Studio Code
Windows PowerShellOpen Visual Studio Code
If It Fails
Launch VS Code from Applications or the Start menu. Do not block readiness only because code is missing from PATH.
Run each command in your own terminal. This page cannot run commands on your machine, so tick a box only after you see the expected result.
docker --versiondocker --versiondocker --versionBefore You Run
- Your terminal is open in Any terminal folder.
- Docker Desktop or Docker Engine is running.
Why You're Running This
Confirms the Docker command-line client is installed.
Command Breakdown
docker- Runs the docker tool with the shown arguments to complete this lesson step.
Expected Result
A Docker version is printedWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Docker CLI is installed or running, then retry the command in a new terminal.
docker infodocker infodocker infoBefore You Run
- Your terminal is open in Any terminal folder.
- Docker Desktop or Docker Engine is running.
Why You're Running This
Confirms Docker is running before the local emulator starts.
Command Breakdown
docker- Runs the docker tool with the shown arguments to complete this lesson step.
Expected Result
Docker server information is returnedWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Docker Engine is installed or running, then retry the command in a new terminal.
python3 --versionpython3 --versionpy --version
# If py is unavailable:
python --versionBefore You Run
- Your terminal is open in Any terminal folder.
- Python 3 is installed; activate .venv first when the lesson has already created it.
Why You're Running This
Confirms Python 3 is installed. Windows PowerShell uses py --version, with python --version as a fallback.
Command Breakdown
python- Runs the selected Python module or script with the supplied arguments.
py- Runs the py tool with the shown arguments to complete this lesson step.
#- Runs the # tool with the shown arguments to complete this lesson step.
Expected Result
A supported Python 3.x version is printedWhat Changed
BeforeThe saved program has not yet been executed for this verification step.
AfterThe program ran and produced output or started the local process described by the lesson.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Python is installed or running, then retry the command in a new terminal.
git --versiongit --versiongit --versionBefore You Run
- Your terminal is open in Any terminal folder.
- Git is installed; cloning also requires an internet connection.
Why You're Running This
Confirms Git is available to download the public ENJYRA Cloud Labs repository.
Command Breakdown
git- Runs the git tool with the shown arguments to complete this lesson step.
Expected Result
A Git version is printedWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Git is installed or running, then retry the command in a new terminal.
Download the official public ENJYRA Cloud Labs repository. It contains the launchers, Compose files, and verification scripts used by B01, B02, and B03. Students do not manually create these files.
Already downloaded it? Reuse the same folder, open a terminal inside it, and continue to verification.
git clone https://github.com/gudshuis/enjyra-cloud-labs.git
cd enjyra-cloud-labsgit clone https://github.com/gudshuis/enjyra-cloud-labs.git
cd enjyra-cloud-labsgit clone https://github.com/gudshuis/enjyra-cloud-labs.git
Set-Location enjyra-cloud-labsBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
- Git is installed; cloning also requires an internet connection.
Why You're Running This
Downloads the official ENJYRA Cloud Labs repository and moves your terminal into its folder.
Command Breakdown
git clone- Downloads a complete working copy of the official public ENJYRA Cloud Labs repository.
https://github.com/gudshuis/enjyra-cloud-labs.git- Identifies the official public repository to download.
cd / Set-Location- Moves macOS/Linux Terminal or native Windows PowerShell into the downloaded lab folder.
Expected Result
enjyra-cloud-labs/
├── scripts/
├── compose/
├── verify/
└── VERSIONWhat Changed
BeforeThe repository folder is not present in this workspace.
AfterA local repository folder exists and the terminal has moved into it when the command includes cd / Set-Location.
Verify It
macOSgit -C enjyra-cloud-labs status --short
Linuxgit -C enjyra-cloud-labs status --short
Windows PowerShellgit -C enjyra-cloud-labs status --short
No output means the downloaded working tree is clean.
If It Fails
- If Git is not installed, complete the Git setup above. If cloning reports a network error, confirm your internet connection and retry.
What this command does Downloads the official ENJYRA Cloud Labs repository and moves your terminal into its folder.
enjyra-cloud-labs/
├── scripts/
├── compose/
├── verify/
└── VERSIONIf it fails
If Git is not installed, complete the Git setup above. If cloning reports a network error, confirm your internet connection and retry.
Run the verifier for your operating system before starting a local cloud lab. It checks required files, checksums and integrity, Docker, Docker Compose, Git, Python, and launcher availability.
./verify/verify-enjyra-lab-macos.sh./verify/verify-enjyra-lab-linux.sh.\verify\verify-enjyra-lab.ps1Before You Run
- Your terminal is open in enjyra-cloud-labs.
Why You're Running This
Reads the downloaded files and local tool state without starting AWS, Azure, or GCP.
Command Breakdown
./verify/verify-enjyra-lab-macos.sh- Runs the macOS integrity and prerequisite verifier from the repository.
./verify/verify-enjyra-lab-linux.sh- Runs the Linux integrity and prerequisite verifier from the repository.
.\verify\verify-enjyra-lab.ps1- Runs the native Windows PowerShell verifier; WSL is not required.
Expected Result
PASS: All files match checksums.txt
Integrity: VERIFIEDWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Do not start the lab after a checksum failure. Replace only the incomplete enjyra-cloud-labs folder with a fresh clone, then run the verifier again. If Docker fails, start Docker Desktop or Docker Engine first.
What this command does Reads the downloaded files and local tool state without starting AWS, Azure, or GCP.
PASS: All files match checksums.txt
Integrity: VERIFIEDIf it fails
Do not start the lab after a checksum failure. Replace only the incomplete enjyra-cloud-labs folder with a fresh clone, then run the verifier again. If Docker fails, start Docker Desktop or Docker Engine first.
- Docker CLI verified
- Docker Engine running
- Python verified
- Git verified
- VS Code ready
- ENJYRA Cloud Labs downloaded
- ENJYRA Cloud Labs integrity verified
Need help with a prerequisite?
Docker is not running? Open Docker Desktop or start Docker Engine, then run docker info again.
The repository will not clone? Confirm Git is installed and your internet connection can reach github.com, then retry.
Integrity verification failed? Do not start the lab. Remove only the incomplete enjyra-cloud-labs folder, clone the official repository again, and rerun the verifier.
A lab port is already in use? Stop the process using the lesson port; do not prune unrelated Docker resources.
The console stays on STARTING? Run the lesson status command, then inspect only this lab with the lesson logs command.
Launch the ENJYRA Lab
Start only after the prerequisite checks above are complete.
One start command runs the lesson-scoped emulator and localhost console. The browser detects when it is ready.
ENJYRA Lab · b03-storage-v6.0.0
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp start./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp start.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp startBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Starts this lesson’s emulator and ENJYRA localhost console as a lesson-scoped Docker Compose project.
Command Breakdown
ENJYRA launcher · GCP · start- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its start action.
Expected Result
The emulator and ENJYRA console report healthy.What Changed
BeforeThe requested local service or lab containers are not yet confirmed running.
AfterThe local service or lab containers are running in the background and can be verified.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Both the emulator and ENJYRA console should report healthy.
If It Fails
- Check the current folder, confirm Docker is running when required, and verify the image or script name before retrying.
What this command does Starts this lesson’s emulator and ENJYRA localhost console as a lesson-scoped Docker Compose project.
The emulator and ENJYRA console report healthy.If it fails
Check the current folder, confirm Docker is running when required, and verify the image or script name before retrying.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp statusBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Checks that both the local emulator and ENJYRA console are healthy before you use the browser interface.
Command Breakdown
ENJYRA launcher · GCP · status- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its status action.
Expected Result
The lab reports READY and its services are healthy.What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp status
Run the command and compare its output with the Expected Result block.
If It Fails
- Confirm the start command completed first, then compare the image, container, port, or script name exactly with this lesson.
What this command does Checks that both the local emulator and ENJYRA console are healthy before you use the browser interface.
The lab reports READY and its services are healthy.If it fails
Confirm the start command completed first, then compare the image, container, port, or script name exactly with this lesson.
Reset My Lab
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp reset./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp reset.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp resetBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Returns this lesson’s local runtime or resources to a known starting state without touching unrelated projects.
Command Breakdown
ENJYRA launcher · GCP · reset- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its reset action.
Expected Result
This lesson’s runtime state is reset or the named lesson container is removed.What Changed
BeforeThe lesson service or local lab may still be running.
AfterThe requested lesson service has been stopped or its lesson-scoped state reset.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Check Docker is running and make sure you are using this lesson’s exact container or launcher name.
What this command does Returns this lesson’s local runtime or resources to a known starting state without touching unrelated projects.
This lesson’s runtime state is reset or the named lesson container is removed.If it fails
Check Docker is running and make sure you are using this lesson’s exact container or launcher name.
Clean up the lab
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh gcp stop./scripts/cloud-labs/enjyra-cloud-lab-linux.sh gcp stop.\scripts\cloud-labs\enjyra-cloud-lab.ps1 gcp stopBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Stops or removes only this lesson’s local runtime so it does not keep using machine resources.
Command Breakdown
ENJYRA launcher · GCP · stop- Uses the operating-system-specific ENJYRA launcher, selects the GCP local lab, and performs its stop action.
Expected Result
The lesson-scoped service or container is no longer running.What Changed
BeforeThe lesson service or local lab may still be running.
AfterThe requested lesson service has been stopped or its lesson-scoped state reset.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Inspect this lesson’s status first, then retry with the exact launcher or container name shown here.
What this command does Stops or removes only this lesson’s local runtime so it does not keep using machine resources.
The lesson-scoped service or container is no longer running.If it fails
Inspect this lesson’s status first, then retry with the exact launcher or container name shown here.
Prove What You Learned
This lesson contains 4 focused questions. You answered 2 before the build; complete the remaining 2 now.