amazon-web-services - 如何在 Windows Server 上的 Elastic Beanstalk 部署中正确使用 AWS Secrets Manager
问题描述
我试图在部署期间将我的应用程序连接字符串从 Secrets Manager 传递到 Elastic Beanstalk。如果我将桌面远程部署到要部署到的服务器上,我可以运行以下命令 -
aws secretsmanager get-secret-value --secret-id XXX-MY-SECRET-ID --version-stage AWSCURRENT --query=SecretString --output text
并且输出正确。都好。
但是,当我尝试通过 .ebextensions 文件夹自动执行此操作时,它总是返回一个空字符串。
所以我尝试了很多东西,首先使用容器命令指向我放置在 .ebextensions 文件夹中的 Powershell 文件,就像这样 -
container_commands:
00-myscript:
command : powershell.exe -ExecutionPolicy Bypass -Command ".\\.ebextensions\\BuildConnectionStrings.ps1"
那么Powershell命令将是
$response = aws secretsmanager get-secret-value --secret-id XXX-MY-SECRET-ID --version-stage AWSCURRENT --query=SecretString --output text
$FileName = "ConnectionStrings.config"
New-Item $FileName -ItemType File
Set-Content $FileName $response
如果我直接在 powershell 中运行它,一切都会按预期工作。但是当我部署站点时,它只会创建一个空文件。
我尝试了将 Powershell 命令直接放入 .ebextensions 配置文件的各种组合,结果始终相同。
我只是无法弄清楚为什么当我直接在服务器上运行相同的命令时它们会起作用,但在通过 EB 部署时却不起作用。
我已经被困了好几天了,有人可以帮忙吗?
解决方案
所以对于其他有这个问题的人......
仅仅在服务器上安装 aws cli 是不够的。我得到的错误是由于 PowerShell 无法识别 aws 命令(即使它已经安装)引起的。
解决方案是在我的脚本开头运行以下代码 -
$command = "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12"
Invoke-Expression $command
Invoke-WebRequest -Uri "https://awscli.amazonaws.com/AWSCLIV2.msi" -Outfile C:\AWSCLIV2.msi
$arguments = "/i `"C:\AWSCLIV2.msi`" /quiet"
Start-Process msiexec.exe -ArgumentList $arguments -Wait
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
aws --version
这确保将(再次)安装 aws cli。
我不知道为什么这是必要的,但它是我找到的唯一解决方案
推荐阅读
- c++ - 从变量转换时出现 std::chrono::time_point 编译器错误
- python - 如何找到组中两个事件之间的时间差
- php - 如何使用 php 从文本文件中获取特定文本?
- wordpress - 使用 Post View Counter 按查看次数最多对 Woocommerce 产品进行排序
- html - 使用 2 Pages 以角度过滤表格
- schema.org - 如何使用“职业”类型使用链接的数字副本标记法律许可?
- android - Gson.toJson() 与 JSONObject.toString()
- javascript - 在 Rails 中安全地清理用户上传的 json
- r - ggplot按行和列多行,带有图例+ sd
- mysql - 如何在mysql中加入来自同一个表的两个选择