05참가자 AWS 배포/예상 약 30분, 별도 일정

ECR·S3·DynamoDB 준비

참가자 전용 기반 스택과 이미지 저장소, 실행 기록 저장소를 구성합니다.

참가자 AWS 배포 · 별도 트랙아직 읽지 않음

이 장부터 참가자 AWS 배포 트랙(05–13장)을 시작합니다. 예상 시간은 약 30분이며, 이미지 다운로드와 AWS 생성 대기, 실습·질문에 따라 조정합니다.

참가자 전용 ECR, 실행 기록 S3, 상태 저장 DynamoDB, 두 비밀키를 만듭니다. 기존 VPC·Subnet·NAT와 인증서는 준비된 자원을 참조합니다. 실습 도구 lab.py는 로컬 파일 준비와 AWS 조회만 수행하며, 실제 생성은 준비된 app 안의 scripts/deploy.py로 진행합니다.

1. 참가자 작업 공간 확인

01장에서 만든 참가자 이름을 그대로 사용합니다. 아직 설정이나 app이 없다면 01장을 먼저 마칩니다. 기존 app에 prepare를 다시 실행해 덮어쓰지 않습니다.

터미널bash
VSCode Server 터미널에서 실행
set -euo pipefail
export ROBOT_REPO=/home/ec2-user/my-project/robot-arm
export ROBOT_TEAM=team01
export ROBOT_CONFIG="$ROBOT_REPO/workshop/.local/$ROBOT_TEAM.json"
export ROBOT_LAB="$ROBOT_REPO/workshop/.local/labs/$ROBOT_TEAM/app"

cd "$ROBOT_REPO"
python3 workshop/scripts/lab.py info --config "$ROBOT_CONFIG"
python3 workshop/scripts/lab.py doctor --config "$ROBOT_CONFIG"

team01은 예시입니다. info의 participant, accountId, workspace를 본인의 값과 대조합니다. prepared: true, Node 24.18.1 이상 24 계열, Python 3.11을 확인합니다. 심화 과정에는 Docker Compose, AWS CLI, boto3, PyYAML, cfn-lint도 필요합니다. doctor에서 선택 도구로 표시되더라도 이 과정에서는 준비되어 있어야 합니다.

새 터미널에서 변수를 복구하는 방법은 자원과 코드 매핑에 있습니다. 운영 루트의 infra/config.json을 참가자 설정으로 복사하지 않습니다.

명령은 Bash에서 순서대로 실행합니다. set -euo pipefail은 경로·설정·검사 실패 뒤 다음 배포 명령이 이어지는 것을 막습니다. 오류로 셸이 종료되면 새 터미널에서 경로를 복구하고 실패한 단계부터 확인합니다.

심화용 Python 의존성은 본인 app의 가상환경에 설치합니다. 호스트 전역 Python이나 다른 참가자 환경을 바꾸지 않습니다. 이후 python3가 이 Python 3.11 환경을 가리키도록 활성화합니다.

터미널bash
VSCode Server 터미널에서 실행
cd "$ROBOT_LAB"
uv pip install --python .venv/bin/python \
  -r agent/requirements.txt PyYAML cfn-lint
source "$ROBOT_LAB/.venv/bin/activate"
python3 -c 'import sys, boto3, yaml; assert sys.version_info[:2] == (3, 11); print("AWS Python 도구 준비 완료")'

2. 기존 네트워크와 인증서 선택

진행자가 허용한 기존 VPC ID를 입력합니다. 조회기는 서로 다른 두 AZ의 Public/Private Subnet, 남은 IP, Private Subnet의 NAT 경로와 CloudFront Prefix List를 확인합니다. 새 VPC나 NAT는 생성하지 않습니다.

터미널bash
VSCode Server 터미널에서 실행
cd "$ROBOT_REPO"
read -r -p "허용된 기존 VPC ID: " ROBOT_VPC
python3 workshop/scripts/lab.py discover \
  --config "$ROBOT_CONFIG" --vpc-id "$ROBOT_VPC"

App 스택은 처음부터 HTTPS로 배포하므로, DNS 연결을 배우는 08장에 앞서 hostname과 인증서를 선택합니다. hostname의 첫 부분은 robot-lab-<참가자>여야 합니다. 아래 입력에는 진행자가 제공한 본인 계정의 발급 완료 인증서 ARN을 사용합니다.

터미널bash
VSCode Server 터미널에서 실행
read -r -p "실습용 상위 도메인(예: labs.example.com): " ROBOT_BASE_DOMAIN
export ROBOT_DOMAIN="robot-lab-$ROBOT_TEAM.$ROBOT_BASE_DOMAIN"
read -r -p "us-east-1의 viewer 인증서 ARN: " ROBOT_VIEWER_CERT
read -r -p "ap-northeast-2의 origin 인증서 ARN: " ROBOT_ORIGIN_CERT

python3 workshop/scripts/lab.py configure-domain \
  --config "$ROBOT_CONFIG" \
  --domain "$ROBOT_DOMAIN" \
  --viewer-certificate "$ROBOT_VIEWER_CERT" \
  --origin-certificate "$ROBOT_ORIGIN_CERT"
python3 workshop/scripts/lab.py doctor --config "$ROBOT_CONFIG" --aws

두 인증서 모두 정확한 실습 hostname을 포함하고 ISSUED여야 합니다. wildcard는 한 단계의 하위 이름만 포함합니다. configure-domain은 로컬 설정만 기록하며 DNS 등록이나 인증서 발급을 하지 않습니다. 서비스 CNAME 등록은 CloudFront 주소가 생긴 뒤 08장에서 수동으로 진행합니다.

3. 참가자 전용 배포 파일 생성

터미널bash
VSCode Server 터미널에서 실행
cd "$ROBOT_REPO"
python3 workshop/scripts/lab.py prepare-cloud --config "$ROBOT_CONFIG"
python3 workshop/scripts/lab.py info --config "$ROBOT_CONFIG"

cd "$ROBOT_LAB"
test -f infra/workshop-binding.json
python3 -B scripts/deploy.py config
python3 -B scripts/deploy.py lint
python3 -B scripts/deploy.py dry-plan

cloudPrepared: true를 확인합니다. 생성된 배포 파일은 참가자·계정·네트워크·인증서에 고정됩니다. 가드 오류를 해결하려고 바인딩이나 템플릿을 직접 수정하지 않습니다. 다른 도메인이나 VPC로 바꿔야 한다면 진행자와 새 참가자 작업 공간을 준비합니다.

dry-plan은 오프라인 자원 목록이며 AWS 변경 세트가 아닙니다. team01이라면 네 스택 이름은 RobotLabTeam01Foundation, RobotLabTeam01AgentCore, RobotLabTeam01Edge, RobotLabTeam01App입니다. Project 태그는 robot-lab-team01, DeploymentOwner는 RobotLabTeam01입니다.

이어서 자원 매핑의 참가자 검증 도구 준비에 있는 두 코드 블록을 실행해 .local/tools/verify-aws.py, .local/tools/verify-demo.py를 저장하고 문법을 검사합니다. 이 준비는 로컬 파일만 만들며 이후 장의 AWS·라이브 검증에서 사용합니다. 운영 루트의 검증 스크립트를 복사하지 않습니다.

4. 이미지 빌드와 기반 스택 생성

build는 로컬 Docker 이미지와 manifest를 만듭니다. ECR에 올리거나 AWS 자원을 만들지 않습니다. 이번 변경에 사용할 새 release 이름을 정하고 이후 장에서도 같은 manifest를 사용합니다.

터미널bash
VSCode Server 터미널에서 실행
cd "$ROBOT_LAB"
test -f infra/workshop-binding.json
umask 077
mkdir -p .local/evidence
export ROBOT_RELEASE="lab-$(date -u +%Y%m%dT%H%M%SZ)"
export ROBOT_ARTIFACTS="$ROBOT_LAB/infra/.state/releases/$ROBOT_RELEASE.json"
python3 -B scripts/deploy.py build --release "$ROBOT_RELEASE"
test -f "$ROBOT_ARTIFACTS"
printf '%s\n' "$ROBOT_RELEASE" > .local/evidence/release.txt

python3 -B scripts/deploy.py plan foundation

plan부터는 AWS에 변경 세트를 생성합니다. 출력과 infra/.state/plans/foundation.json에서 참가자 스택만 생성되는지 확인합니다. ECR, 비공개 S3와 정책, DynamoDB, SessionSecret, OriginSecret이 대상입니다. VPC·DNS·다른 팀 자원이 포함되면 적용하지 않습니다.

터미널bash
VSCode Server 터미널에서 실행
python3 -B scripts/deploy.py apply foundation
python3 -B scripts/deploy.py status --stack foundation \
  > .local/evidence/foundation-status.json
python3 -m json.tool .local/evidence/foundation-status.json

상태가 CREATE_COMPLETE여야 합니다. 진행 중이면 status --stack foundation으로 확인하며 apply를 중복 실행하지 않습니다.

5. ECR 게시와 검사

터미널bash
VSCode Server 터미널에서 실행
cd "$ROBOT_LAB"
python3 -B scripts/deploy.py publish --artifacts "$ROBOT_ARTIFACTS"
python3 -B scripts/deploy.py scan --artifacts "$ROBOT_ARTIFACTS"

publish는 본인 ECR에 이미지를 올리고 manifest에 digest를 기록합니다. 원격 이미지를 태그만으로 배포하지 않습니다. scan은 검사 결과 조회이며, 검사 미완료 또는 HIGH/CRITICAL 발견 시 0이 아닌 종료 상태로 멈춥니다. 검사 대기 중이면 잠시 뒤 scan만 다시 실행합니다.

지속 검사에서 ACTIVE라는 상태만 보고 완료로 판단하지 않습니다. 완료 시각, 페이지 전체 결과, 심각도별 건수를 확인해야 합니다. 검사 종류나 계정 설정 변경이 필요하면 진행자에게 맡기며, 참가자가 공유 ECR/Inspector 설정을 바꾸지 않습니다.

확인 대상 이 장의 완료 근거
이미지 web·simulation·agent의 ARM64 빌드와 본인 ECR digest
Replay S3 Public Access Block, 암호화, 보존 기간·버전 정책
DynamoDB pk·sk, 온디맨드 용량, expiresAt TTL
비밀키 별도 session/origin Secret ARN 두 개. 값은 출력하지 않음
계획 본인 태그와 스택, 공유 네트워크·DNS 변경 없음

실패 시 재개

증상 확인하고 다시 시작할 위치
prepare-cloud가 기존 파일을 거부 info와 기존 바인딩을 확인하고 생성된 app을 계속 사용
Subnet 발견 실패 AZ 쌍, IP 여유, Public IGW/Private NAT 경로를 진행자와 확인
인증서 확인 실패 계정·리전·유효기간·정확한 hostname을 확인
빌드 중 소스 변경 편집을 마치고 새 release로 build
ECR 태그 충돌 기존 이미지를 덮어쓰지 않고 새 release로 빌드·게시
스캔 발견 사항 의존성과 OS 패키지를 검토한 새 이미지로 재검사

완료 체크리스트

  • 내 app의 infra/workshop-binding.json과 계정·네임스페이스를 확인했습니다.
  • 참가자 .local/tools/의 두 검증기를 준비하고 문법을 확인했습니다.
  • Foundation 생성 완료와 비공개 저장소 설정을 확인했습니다.
  • 세 이미지의 digest와 완료된 검사 결과를 확인했습니다.
  • release.txt, manifest, 상태 기록을 참가자 작업 공간에 보관했습니다.
  • 비용 입력값과 보존 자원 과금을 확인했습니다.

AI CLI 카드: 05. 기반 자원 · 다음: 06. AgentCore

AI CLI 프롬프트 카드

아래 프롬프트를 복사해 실습 EC2에서 선택한 Codex, Kiro CLI, Claude Code의 대화 입력창에 붙여넣습니다. Markdown 카드 다운로드

Codex프롬프트 입력

선택한 AI CLI의 대화 입력창에 붙여넣으세요. 세 도구가 같은 프롬프트를 사용합니다.

Robot Atlas 워크숍 05장의 구현 조교로 작업하세요.
ROBOT_REPO, ROBOT_TEAM, ROBOT_CONFIG, ROBOT_LAB은 내가 정한 참가자 경로입니다.
먼저 workshop/chapters/05-foundation.md와 lab.py --help를 읽고 실제 옵션을 확인하세요.

목표:
- 본인 기존 VPC의 Public/Private Subnet 두 AZ와 CloudFront Prefix List를 조회합니다.
- 본인 hostname robot-lab-<참가자>.<허용 도메인>, us-east-1 viewer 인증서,
  서울 origin 인증서를 확인한 뒤 prepare-cloud로 격리된 app을 준비합니다.
- app의 바인딩을 확인하고 lint, dry-plan, 새 release 이미지 빌드를 진행합니다.
- Foundation 변경 세트의 자원·소유 태그·보존 정책을 검토합니다.
- 요청한 AWS 적용 범위에서 apply, ECR 게시, 완료된 스캔 결과를 확인합니다.

작업 경계:
- lab.py는 준비·조회 도구입니다. 존재하지 않는 run/deploy/--execute 옵션을 만들지 마세요.
- 실제 배포 명령은 ROBOT_LAB의 scripts/deploy.py에서만 실행하세요.
- 운영 루트나 다른 참가자 app의 infra/scripts를 배포에 사용하지 마세요.
- 계정·프로파일·네트워크·인증서 바인딩을 오류 우회 목적으로 바꾸지 마세요.
- 기존 VPC/NAT/인증서와 참조 프로젝트를 변경하지 마세요. DNS는 수동입니다.
- .env·자격 증명·Secret 값을 읽거나 복사·출력하지 마세요.
- plan은 AWS 변경 세트 생성, apply는 실제 적용임을 구분하세요.
- 검사 미완료 또는 HIGH/CRITICAL이 있으면 이미지 배포를 진행하지 마세요.

결과:
생성/변경 파일, 실행 명령과 종료 상태, 참가자 스택과 이미지 digest,
완료된 검사 근거, 미실행 항목과 재개 지점을 보고하세요.
dry-plan이나 로컬 빌드만으로 AWS 배포가 완료되었다고 말하지 마세요.

읽기 기록

읽음 표시는 이 브라우저에만 저장됩니다.
실제 실습 결과는 터미널에서 확인하세요.