坑合集
学习过程中实际碰到的问题,按类别整理。详细经过见各 Phase 的页面。
Windows / PowerShell
| 现象 |
原因 |
对策 |
出处 |
-backend-config=backend.hcl 被拆成两个参数 |
PowerShell 5.1 在 . 处拆分参数 |
整个参数加引号:"-backend-config=backend.hcl"(-out=、-generate-config-out= 也一样) |
Phase 3 |
| zip 在 Linux(Cloud Shell / Resource Manager)上解不开 |
Compress-Archive 的路径分隔符是 \ |
tar.exe -a -c -f x.zip -C <dir> . 或者用 tar.gz |
Phase 5b |
pip install oci-cli → FileNotFoundError |
Windows 路径上限 259 字符 |
先查 wheel 里最长的路径;改用 Python SDK,或装到短路径(官方安装脚本也一样装不上) |
Phase 5b、Phase 7 |
git push 卡住:auto-detection of host provider took too long |
Git Credential Manager 判断服务类型时超时 |
git config credential.<URL>.provider generic |
Phase 7 |
checkov → UnicodeDecodeError: 'cp932' |
用系统编码读文件,中文注释读不了 |
$env:PYTHONUTF8 = '1' |
Phase 5a |
刚装的 terraform / tflint 找不到 |
PATH 是终端启动时读的 |
重开终端 |
Phase 0 |
OCI 设定
| 现象 |
原因 |
对策 |
出处 |
did not find a proper configuration for private key |
key_file=... # TODO,config 不支持行尾注释 |
删掉 # TODO |
Phase 0 |
Resource Search 里删掉的资源还是 ACTIVE |
搜索索引有延迟 |
用 get_xxx API 直接查 |
Phase 4 |
dnf install 成功,但不能证明 NAT GW 通了 |
OCI 的 dnf 仓库属于 Oracle Services,走 Service GW |
用 curl ifconfig.me 确认出口 IP |
Phase 4 |
| NSG 规则的 import ID 在 Console 上看不到 |
规则 ID 不显示 |
用 data source oci_core_network_security_group_security_rules 查 |
Phase 3 |
SDK 的 drift 结果 json.loads 报 TypeError |
已经是 dict 了 |
直接当 dict 用 |
Phase 5b |
Cloud Shell
| 现象 |
原因 |
对策 |
出处 |
ED25519 keys are not allowed in FIPS mode |
Cloud Shell 是 FIPS 模式 |
用 RSA(-t rsa -b 4096) |
Phase 4 |
ansible.posix.firewalld → couldn't resolve module |
Cloud Shell 的 Ansible 是 2.9 |
用短名 firewalld |
Phase 2 |
| subnet 删不掉(Terraform 一直重试) |
Cloud Shell private network 的 VNIC 还挂在 subnet 里 |
destroy 前把 Network 切回 Public |
Phase 6 |
| Upload 只能传一个文件 |
规格如此 |
打成 tar.gz 再传 |
Phase 2 |
| build 的镜像在 Function 上跑不了 |
Cloud Shell 默认是 ARM(aarch64) |
Actions → Architecture → x86_64 |
Phase 8 |
docker push 后没有 digest: |
Cloud Shell 的 docker 是 Podman |
看最后的 Writing manifest to image destination |
Phase 8 |
网络 / 本机环境
| 现象 |
原因 |
对策 |
出处 |
从本机 SSH → Connection timed out |
所在网络屏蔽了出站 22 端口 |
Cloud Shell + private network,或 OCI Bastion(在 Cloud Shell 里用) |
Phase 2 |
| 想放行 Cloud Shell 的 IP |
出口 IP 是 Oracle 共用的,而且会变 |
不放行公网 IP,改用 private network |
Phase 2 |
| 浏览器打不开 GitHub(命令行能连) |
所在网络屏蔽 |
不绕过 → CI/CD 改用 OCI DevOps |
Phase 7 |
| OCI DevOps 的仓库 SSH 连不上 |
22 端口被屏蔽 |
HTTPS + Auth Token |
Phase 7 |
| Bastion session 连不上(Security List 只放行了 Oracle 服务 443) |
Bastion 的 private endpoint 在同一个 subnet,它 → VM 的 22 是"出站" |
加"subnet 内 22 出站" |
Phase 9 |
curl ifconfig.me 在 Flow Logs 里没有记录 |
没有路由的通信不出现(推测:路由阶段就被丢掉) |
出不了公网的确认用 curl 的结果,不靠 Flow Logs |
Phase 9 |
OCI DevOps
| 现象 |
原因 |
对策 |
出处 |
Unable to fetch build_spec file ... RelatedResourceNotAuthorizedOrNotFound |
repos 是 OCIR 的资源类型 |
read devops-repository |
Phase 7 |
runner 里 pip → ProxyError ... Name or service not known |
runner 镜像的 pip 配置里有 Oracle 内部代理 |
PIP_CONFIG_FILE=/dev/null |
Phase 7 |
| 第一次 push 被拒(non-fast-forward) |
建仓库时自动生成了空的 "Initial Commit" |
git push --force(只覆盖空 commit) |
Phase 7 |
default_branch 每次 plan 都有差异 |
API 存成 refs/heads/main |
代码里写 refs/heads/main |
Phase 7 |
Monitoring / Functions
| 现象 |
原因 |
对策 |
出处 |
| 告警邮件是 JSON |
message_format = "PRETTY_JSON" |
ONS_OPTIMIZED(只改邮件,Function 收到的仍是 JSON) |
Phase 8 |
| 恢复网站后又被停掉 |
告警恢复(FIRING_TO_OK)的消息也会调用 Function |
Function 里跳过 FIRING_TO_OK / RESET |
Phase 8 |
| 其他 Budget 的告警也把网站停掉 |
Events 规则会收到所有 Budget、所有规则的事件 |
Function 不看事件内容,自己查 Budget 的实际费用 |
Phase 8 |
新建 Budget → 400-LimitExceeded |
每个 compartment 只能有 1 个 Budget |
data source 读现有的 Budget,只加告警规则(不 import) |
Phase 8 |
docker push 到 OCIR 403 |
切换 Cloud Shell 架构后登录凭证没了 |
重新 docker login |
Phase 8 |
docker login 到 OCIR 失败 |
用户名格式和 git 不一样 |
<namespace>/<用户名> |
Phase 8 |
Vault / Logging
| 现象 |
原因 |
对策 |
出处 |
新建 bucket(CMK)→ 404-NotAuthorizedOrFoundKmsKey |
Policy 刚建好,IAM 还没生效(depends_on 只保证顺序) |
过一会儿再 apply |
Phase 9 |
Connector → Invalid batchRolloverTimeInMs |
范围 60000〜420000 ms |
最长 7 分钟(420000) |
Phase 9 |
读 Secret → NotAuthorizedOrNotFound(404) |
没权限和不存在都返回 404 |
确认 Policy(read secret-bundles)和 Dynamic Group |
Phase 9 |
| Flow Logs 里有 Oracle 服务 → VM 临时端口的 REJECT |
推测:连接结束后迟到的包 |
正常现象 |
Phase 9 |
| 现象 |
原因 |
对策 |
出处 |
in-place(~)的 apply 后 LB 返回 502 |
改的属性会让 VM 重启,两台同时重启 |
一台一台改(-target 分开 apply 等) |
Phase 5a |
改 user_data 后 VM 被重建 |
cloud-init 的内容是 # forces replacement |
配置管理交给 Ansible |
Phase 2 |
| 新镜像发布后 VM 要被重建 |
data source 查到了新镜像 |
ignore_changes = [source_details[0].source_id] |
Phase 3 |
| node pool "complete" 了,但节点还没 ready |
Terraform 只等 API 返回 |
用 SDK 确认节点状态 |
Phase 6 |
| checkov 判定失败,但代码是对的 |
checkov 只认 launch_options 里的写法 |
按 checkov 的写法改,或看 checkov 的源码 |
Phase 5a |
If LaunchOptions is provided, NetworkType must be specified |
写了 launch_options 就必须指定 |
network_type = "PARAVIRTUALIZED"(和镜像的默认值一致) |
Phase 9 |
| 建 VM 时 in-transit 加密被忽略(API 是 false) |
建时的请求不生效 |
第 2 次 apply(in-place update,会重启);用 API 确认 |
Phase 9 |
(sensitive value) 的密码在 state 里是明文 |
sensitive 只是不显示 |
密码让 Vault 生成(enable_auto_generation),Terraform 只建框 |
Phase 9 |
Kubernetes / OKE
| 现象 |
原因 |
对策 |
出处 |
| Service LB 建好后 Terraform 出现 drift |
OKE 自动往 Security List 加规则 |
提前放行 NodePort,annotation security-rule-management-mode: "None" |
Phase 6 |
terraform destroy 删不掉 LB |
LB 是 K8s 建的,不在 state 里 |
先 kubectl delete,再 destroy |
Phase 6 |
| drain 后 uncordon,Pod 还是集中在一台节点 |
K8s 不会主动重新分配 |
rollout restart;正式环境用 topologySpreadConstraints |
Phase 6 |