이 문서는 GitHub Actions로 OpenPCC v0.002를 AWS에 배포하는 방법을 단계별로 설명합니다. 초보자가 따라할 수 있도록 최소 개념과 입력값을 정리했습니다.
- AWS 계정 준비
- GitHub Actions Secrets에 AWS_ROLE_ARN 저장
- 공개 레지스트리(ECR Public 등) 준비
- VPC Subnet, Security Group 준비 (router/compute 분리 권장)
- EC2 Instance Profile(역할) 준비
- AMI ID(예: Ubuntu 22.04) 결정
- GitHub Actions에서 One-shot deploy 워크플로 실행
이 프로젝트의 워크플로는 GitHub Actions OIDC로 AWS 역할을 가정합니다.
Access Key는 사용하지 않습니다.
- IAM → Identity providers →
token.actions.githubusercontent.com등록 - IAM → Roles → Create role → Web identity
- Provider:
token.actions.githubusercontent.com - Audience:
sts.amazonaws.com - (권장) Subject 제한:
repo:nnstreamer/hybrid:ref:refs/heads/*
- Provider:
배포에는 대략 다음 권한이 필요합니다:
- EC2 인스턴스 생성 (
ec2:RunInstances,ec2:CreateTags) - 공개 레지스트리(ECR Public 등) 푸시/조회 권한
- 예:
ecr-public:GetAuthorizationToken,ecr-public:CreateRepository,ecr-public:DescribeRepositories,ecr-public:BatchCheckLayerAvailability,ecr-public:InitiateLayerUpload,ecr-public:UploadLayerPart,ecr-public:CompleteLayerUpload,ecr-public:PutImage
- 예:
- 필수:
sts:GetServiceBearerToken(ECR Public 로그인/푸시용) - 간단히는
AmazonElasticContainerRegistryPublicFullAccess사용 가능 - Instance Profile을 부착할 때의
iam:PassRole
AWS Console:
- IAM → Roles → (GitHub Actions용 Role 선택) → ARN
CLI:
aws iam get-role --role-name <ROLE_NAME> --query Role.Arn --output textGitHub 리포지토리 → Settings → Secrets and variables → Actions 에 아래를 추가:
AWS_ROLE_ARN
이 값들은 워크플로가 자동으로 사용합니다.
이미지 빌드/푸시 및 배포를 위해 로그인 없이 pull 가능한 공개 레지스트리가 필요합니다.
현재 워크플로는 **public ECR(public.ecr.aws/*)**만 허용합니다.
스크립트 기본값은 아래 이름입니다:
openpcc-routeropenpcc-computeopenpcc-client(선택)
AWS 콘솔 → ECR → Create repository
배포할 VPC의 퍼블릭 Subnet ID가 필요합니다.
가능하면 server-1/2/3/4를 분리된 Security Group으로 구성하는 것을 권장합니다.
- 인바운드
- TCP 3600 (router)
- TCP 3200 (gateway)
- TCP 3501 (credithole)
- 권장 접근 제어
- 3600은 server-2 SG에서만 허용
- 3200은 server-4 SG에서만 허용 (oHTTP relay 사용 시)
- 인바운드
- TCP 8081 (router_com)
- 권장 접근 제어
- server-1 SG에서만 접근 허용 권장
- 인바운드
- TCP 8080 (
/api/config,/healthz)
- TCP 8080 (
- 권장 접근 제어
- 운영 환경에 맞는 클라이언트/내부 네트워크만 허용
- 인바운드
- TCP 3100 (oHTTP relay)
- 권장 접근 제어
- 클라이언트 접근 필요 범위에 맞게 제한
- server-1 gateway(3200) 으로의 아웃바운드가 가능해야 함
모든 서버에 Instance Profile을 부착하도록 배포 스크립트가 고정되어 있습니다.
따라서 Instance Profile은 필수 입력값입니다.
- IAM → Roles → Create role
- Use case: EC2
- 권한 예시: ECR read + S3 read(옵션)
AmazonEC2ContainerRegistryReadOnlyAmazonS3ReadOnlyAccess(EIF를 S3에서 내려받을 경우)- 가능하면 S3는 특정 버킷/경로만 허용하는 커스텀 정책으로 최소권한 적용 권장
Role 생성 후 동일 이름의 Instance Profile이 자동 생성됩니다. 아래 경로에서 Instance Profile ARN을 복사해 두세요.
- IAM → Roles → (방금 만든 Role 선택) → Summary → Instance profile ARN
주의: Role ARN과 Instance Profile ARN은 다릅니다.
배포 입력값에는 Instance Profile ARN을 사용해야 합니다.
CLI로 확인하려면:
aws iam list-instance-profiles-for-role --role-name <ROLE_NAME>출력의 Arn 값이 Instance Profile ARN입니다.
이 시스템은 Ubuntu 22.04를 기준으로 구성되어 있습니다.
예시:
- Ubuntu 22.04 LTS AMI ID
Compute Node(서버-2) 는 Nitro Enclaves 지원 인스턴스 타입이 필요합니다.
GitHub Actions → OpenPCC v0.002 One-shot Deploy 워크플로를 실행합니다.
이 워크플로는 build/pack/deploy를 한 번에 수행하며,
server-1 → server-4 → server-3 → server-2 순서로 순차 배포를 진행합니다.
배포 스크립트는 Nitro Enclave 실행을 전제로 합니다. Docker 기반 테스트는 로컬/CI 스모크 테스트 용도입니다.
aws_regionsubnet_idrouter_security_group_idcompute_security_group_idami_id(공통 AMI 또는 server별 AMI 기반)image_registry(public.ecr.aws/alias)auth_security_group_id(enable_server3=true일 때)relay_security_group_id(server-4 배포 스크립트를 사용할 때)
key_name(EC2 SSH 키, 필요 시)instance_profile_arn(public ECR + OHTTP_SEEDS_JSON 직접 입력이면 생략 가능)enable_server3(server-3 빌드/배포 활성화)enable_server4(server-4 빌드/배포 활성화)enable_server3_ohttp_advertise(server-3 oHTTP config 광고)enable_real_attestation_for_client(client용 real attestation 정책 활성화)enable_fake_attestation_for_server2(server-2 fake attestation 빌드)enable_compute_monitor(server-2 모니터 설치)compute_instance_type,edge_instance_typeenclave_cpu_count,enclave_memory_mib,enclave_cidOPENPCC_RELAY_URLS_JSON(enable_server3_ohttp_advertise=true 이면서 server-4를 배포하지 않을 때 필요)
enable_real_attestation_for_client=true와enable_fake_attestation_for_server2=true는 동시에 사용할 수 없습니다.배포 스크립트는 인스턴스 내부에서 ECR 로그인/S3 다운로드를 수행하지 않습니다.
EIF는 Compute 인스턴스에서 로컬로 생성됩니다.
one-shot deploy는 oHTTP seed를 구성하기 위해 OHTTP_SEEDS_JSON을 읽습니다.
OHTTP_SEEDS_SECRET_REF는 deploy_server1.sh가 JSON을 조회해 주입할 때만 사용됩니다
(gateway 자체는 OHTTP_SEEDS_JSON만 읽습니다).
필수(One-shot deploy에서 enable_server3_ohttp_advertise=true): OHTTP_SEEDS_JSON 직접 입력
- GitHub Secrets:
OPENPCC_OHTTP_SEEDS_JSON(권장) - 또는 Repository Variables:
OPENPCC_OHTTP_SEEDS_JSON
예시(JSON 배열):
[
{
"key_id": "01",
"seed_hex": "0123456789abcdef...64hex...",
"active_from": "2026-01-30T00:00:00Z",
"active_until": "2026-07-30T00:00:00Z"
}
]참조 방식(OHTTP_SEEDS_SECRET_REF, 선택)
- Repository Variable:
OPENPCC_OHTTP_SEEDS_SECRET_REF
- seed 데이터 준비(예:
ohttp_seeds.json)
[
{
"key_id": "01",
"seed_hex": "0123456789abcdef...64hex...",
"active_from": "2026-01-30T00:00:00Z",
"active_until": "2026-07-30T00:00:00Z"
}
]seed 생성 예시:
openssl rand -hex 32- Secrets Manager에 저장
aws secretsmanager create-secret \
--name openpcc-ohttp-seeds \
--secret-string file://ohttp_seeds.json- 출력된 ARN을
OHTTP_SEEDS_SECRET_REF로 설정
OPENPCC_OHTTP_SEEDS_SECRET_REFRepository Variable에 입력
- 인스턴스 프로파일 권한
secretsmanager:GetSecretValue권한을 해당 ARN에 부여OHTTP_SEEDS_SECRET_REF를 사용할 경우INSTANCE_PROFILE_ARN이 필요합니다.
- 위와 동일한 JSON 포맷으로 저장
- 참조 문자열을
OHTTP_SEEDS_SECRET_REF로 설정- 예:
ssm:/openpcc/ohttp-seeds,vault://secret/openpcc/ohttp,s3://bucket/path/ohttp_seeds.json
- 예:
- 해당 저장소에 접근 가능한 IAM/크레덴셜을 인스턴스에 부여
주의:
deploy_server1.sh는 일부 저장소(AWS Secrets Manager/SSM)만 조회합니다.
server-1gateway 자체는 OHTTP_SEEDS_JSON만 읽습니다.
- 개발/로컬 테스트는 TPM Simulator(mssim) 를 사용합니다.
- 배포 스크립트는 Compute 호스트에 다음 systemd 서비스를 구성합니다:
openpcc-tpm-sim: TPM Simulator 실행openpcc-vsock-router,openpcc-vsock-tpm-*: Enclave → Router/TPM 접근용 VSOCK 프록시openpcc-enclave-health-proxy: Router → Enclave(8081) 헬스체크 프록시
- 운영 환경에서는 TPM Simulator를 제거하고 **Nitro Enclave Attestation(NSM 기반)**으로 교체해야 합니다.
enclave_cid는 VSOCK 주소 식별자이며, 호스트가 Enclave로 연결할 때 사용합니다.- 기본값(16)으로 동작하도록 구성되어 있으며, 변경 시 호스트/Enclave 프록시가 동일 값을 사용해야 합니다.
- TPM 시뮬레이터 포트는 기본적으로 2321/2322를 사용하며, 배포 스크립트는 platform 포트를 cmd 포트 + 1로 보정합니다.
One-shot deploy는 입력값이 비어 있으면 Repository Variables 값을 사용합니다.
자동 저장 기능은 제공하지 않습니다.
Variables 위치: GitHub 리포지토리 → Settings → Secrets and variables → Actions → Variables
주요 변수 예시(기본값 용도)
OPENPCC_AWS_REGIONOPENPCC_SUBNET_IDOPENPCC_ROUTER_SECURITY_GROUP_IDOPENPCC_AUTH_SECURITY_GROUP_IDOPENPCC_COMPUTE_SECURITY_GROUP_IDOPENPCC_RELAY_SECURITY_GROUP_IDOPENPCC_INSTANCE_PROFILE_ARNOPENPCC_IMAGE_REGISTRYOPENPCC_KEY_NAMEOPENPCC_AMI_IDOPENPCC_ENCLAVE_CPU_COUNTOPENPCC_ENCLAVE_MEMORY_MIBOPENPCC_ENCLAVE_CID
이 값들은 Secrets가 아니라 Variables에 저장됩니다.
민감한 값은 저장하지 않는 것을 권장합니다.
- 현재 배포는 server-1의 private IP를 기준으로 router/gateway 주소를 구성합니다.
- 모든 서버가 동일 Subnet에 있는 PoC 환경을 전제로 동작합니다.
- 다른 배포 방식(예: 멀티 VPC, 퍼블릭 DNS/ALB, 교차 서브넷)에서는 주소 해석 문제가 발생할 수 있습니다.
- Prebuilt EIF 사용 시 router 주소 bake-in 문제
- 사전 빌드 EIF는 router 주소가 이미 고정되어 있어야 정상 동작합니다.
- one-shot deploy처럼 router IP가 배포 후 결정되는 흐름에서는 prebuilt EIF 사용을 권장하지 않습니다.
- EC2 콘솔에서 인스턴스 생성 확인
- Router 인스턴스에서 포트 3600 응답 확인
- 필요 시 client smoke test로 상태 점검
예시(로컬에서 실행):
ROUTER_URL=http://<router-ip>:3600 ./client/smoke_test.sh
아니요. GitHub Secrets에 AWS_ROLE_ARN을 등록하면 워크플로가 자동으로 사용합니다.
다음 조건에서는 필요합니다.
OHTTP_SEEDS_SECRET_REF로 seed를 조회할 때 (server-1에서 AWS API 호출)- public ECR이 아닌 레지스트리를 사용할 때
public ECR 사용 + OHTTP_SEEDS_JSON 직접 입력이라면 생략 가능합니다.
Nitro Enclaves를 쓰는 경우 EIF가 필요합니다.
즉시 테스트만 한다면 로컬/CI에서 Docker 기반으로 실행할 수 있습니다(개발용).
- AWS_ROLE_ARN을 GitHub Secrets에 등록
- 공개 레지스트리/네트워크/AMI 준비 (필요 시 Instance Profile)
- One-shot deploy 워크플로 실행
여기까지 완료하면 GitHub Actions만으로 배포가 가능합니다.
이 섹션은 로컬 통합 테스트(system_test.sh) 실행 중 겪는 문제를 예방하기 위한 안내입니다.
Docker 데몬 권한 문제를 피하려면 다음 방식으로 실행합니다.
sudo -E ./system_test.sh
빌드/실행이 서로 다른 Docker 데몬을 사용하면 이미지가 보이지 않는 문제가 발생할 수 있습니다.
스크립트는 고정된 컨테이너 이름과 호스트 포트를 사용합니다.
- 컨테이너:
openpcc-tpm-sim,openpcc-ollama,openpcc-router,openpcc-compute - 포트: 2321, 2322, 11434, 3600, 8081
이미 동일한 컨테이너/포트가 사용 중이면 충돌이 발생할 수 있습니다.
로컬 클라이언트 코드에서 투명성 정책이 없으면 다음 에러가 날 수 있습니다.
transparency identity policy source is 'configured' but no policy was provided
테스트 클라이언트 코드를 수정할 경우에는 LocalDevIdentityPolicy를 설정하세요.