반응형
AWS 인프라를 Terraform으로 프로비저닝하면서, null_resource + local-exec 프로비저너를 활용해 OpenVPN 서버에서 client.ovpn 파일을 scp로 다운로드하는 작업을 넣었습니다.
그런데 terraform apply 실행 시 콘솔 로그에 다음과 같은 출력이 계속 찍히는 문제가 발생했습니다.
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn: Still creating... [00m20s elapsed]
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn (local-exec): .
Terraform이 local-exec 출력 스트림을 받으면서, 줄바꿈 없는 stderr/진행바 같은 것들을 . 으로 치환해서 보여주기 때문에 발생하는 현상입니다. 즉, ssh/scp가 남기는 프로그레스 메시지를 Terraform이 점(.)으로 바꿔 찍어버리는 거죠.
문제 원인 정리
- PowerShell 진행 표시 문제
- $ProgressPreference가 기본값(Continue)일 때, PowerShell은 Copy-Item, Start-Sleep 같은 내부 cmdlet에 대해 진행 상태를 Write-Progress로 계속 뿌린다.
- Terraform 콘솔은 이걸 제대로 해석하지 못하고 .으로 찍는다.
- ssh/scp 자체의 stderr 출력
- scp는 기본적으로 전송 진행률을 stderr로 출력한다. (예: ########## 12%)
- Terraform은 줄바꿈 없는 stderr를 그대로 찍지 못하고 .으로 대체한다.
해결 방법
1) PowerShell 진행바 억제
스크립트 상단에 다음을 추가한다:
$ProgressPreference = 'SilentlyContinue'
이걸 넣으면 PowerShell 자체 cmdlet의 프로그레스 바 출력은 사라진다.
2) ssh/scp 출력 억제
ssh와 scp 실행 시 다음 옵션을 추가한다:
-q -o LogLevel=ERROR
여기에 추가로, PowerShell에서 표준 출력/에러를 모두 버리려면:
*> $null
즉, 최종 호출은 다음과 같이 조용하게 만든다:
ssh -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i $KeyPath ec2-user@$HostIp 'sudo test -r /home/ec2-user/client.ovpn' *> $null
scp -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i $KeyPath "$remoteSpec" "$LocalFile" *> $null
최종 코드 (핵심 부분)
provisioner "local-exec" {
command = <<EOT
$ProgressPreference = 'SilentlyContinue'
$HostIp = "${aws_instance.openvpn.public_ip}"
$RemoteFile = "/home/ec2-user/client.ovpn"
$LocalFile = "./client.ovpn"
$KeyPath = "C:/Users/$env:USERNAME/.ssh/barun-dev-eks-connect.pem"
# 파일 존재 여부 확인 (조용히)
ssh -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$KeyPath" ec2-user@$HostIp "sudo test -r $RemoteFile" *> $null
# 다운로드 (조용히)
$remoteSpec = "ec2-user@${HostIp}:${RemoteFile}"
& scp -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$KeyPath" "$remoteSpec" "$LocalFile" *> $null
Write-Host "✅ client.ovpn 다운로드 완료"
EOT
interpreter = ["PowerShell", "-Command"]
}
결론
- Terraform local-exec에서 보이는 . 출력은 PowerShell 진행바와 ssh/scp stderr 때문이다.
- $ProgressPreference = 'SilentlyContinue'로 PowerShell 프로그레스는 끄고,
- ssh/scp에는 -q -o LogLevel=ERROR 옵션 + *> $null 리다이렉션을 적용하면 된다.
이렇게 하면 로그에 불필요한 점(.)이 사라지고, 내가 Write-Host로 남긴 메시지(✅ 다운로드 성공, ⏳ xx초 경과)만 깔끔하게 표시된다.
반응형
댓글