最初,我启动了一个全新的 Windows Server 2016 服务器 EC2。我分配了一个S3 完全管理员启动此实例时,将 IAM 角色分配给它。我在其上安装了 CLI。我启动了一个 CMD 窗口,然后输入“亚马逊AWS S3 LS“。它列出了我所有的存储桶。一切运行正常。
然后我从这个实例创建了一个 AMI。我使用该 AMI 从这个实例启动了一个新实例S3 完全管理员IAM 角色。 “亚马逊AWS S3 LS“ 仍然有效。
然后,几天后,当我重复上述过程(从同一个 AMI 启动实例)时,“亚马逊AWS S3 LS“将停止工作,并出现以下错误:
Unable to locate credentials. You can configure credentials by running "aws configure".
这种情况发生过很多次。每次我重建新的 Windows Server、安装 CLI、为实例分配 S3 完整管理员角色时,它都会正常工作。几天后,当我从完全相同的 AMI 启动新实例时,“亚马逊AWS S3 LS“将停止工作。
这太神秘了!有人能解释一下吗?
答案1
IAM 角色不会与您的 AMI 捆绑在一起。
因此,当您从 AMI 启动新的 EC2 实例时,您必须将 IAM 角色分配给启动的新 EC2 实例。如果在启动时或之后没有分配角色,CLI 将无法找到凭证。
答案2
我最近在从自己的 AMI 部署 Windows EC2 实例时遇到了同样的问题。正如@Kugel (https://serverfault.com/users/138998/kugel) 在他们的回答 (此问题的上一个回答) 中提到,可以看到,执行 Get-NetRoute 命令时 NextHop 的值在新实例中不会改变,并且实例保留了生成 AMI 的基本实例中现有网络配置的先前值。
然后,为了解决这个问题,我使用新的 NextHop 值创建了新的网络路由,并删除了最旧的路由。以 @kugel 给出的输出为例,新路由的创建将是:
Set-NetRoute -InterfaceIndex 3 -DestinationPrefix "169.254.169.254/32" -RouteMetric 15 -NextHop 10.2.6.1
对其余目标前缀重复上一个命令(169.254.169.123/32、169.254.169.249/32、169.254.169.250/32、169.254.169.251/32 和 169.254.169.253/32)
一旦创建了新的网络路由,您就可以使用以下命令删除最旧的路由:
Remove-NetRoute -NextHop 10.2.4.1
上述命令将删除所有以该 IP 作为 NextHop 的实例。
命令参考:
答案3
我在遇到同样的问题时发现了这个问题。最终为我解决的是这个答案我在下面引用了它,以便不只通过链接就能得到答案。
有一个脚本调用InitializeInstance.ps1,它可以重置一些配置信息。
例如,如果实例已更改子网,则可能由于缓存的路由规则而无法正常工作。 InitializeInstance.ps1 可以纠正此问题。
正如该答案的最热评论所指出的:
在 Windows 实例中,此脚本位于此处:C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1
答案4
这已经是老问题了,但对于当前(2024 年第一季度)的类似问题,几乎没有任何帮助。即使在最新的实例元数据版本 (IMDSv2) 中,您也可能会发现自己处于端点iam
根本不存在但其他元数据存在的情况:
$token = Invoke-RestMethod -Method PUT -Headers @{ "X-aws-ec2-metadata-token-ttl-seconds" = 21600 } -Uri http://169.254.169.254/latest/api/token
# You should see your role name here
Invoke-RestMethod -Headers @{ "X-aws-ec2-metadata-token" = $token } -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/
就我的情况来说/meta-data/iam/*
,它丢失了,iam
钥匙本身也丢失了。
原因是在实例首次启动后添加并链接我的实例角色。事实证明,有一些初始化脚本在首次启动时运行,如果您的实例配置文件和角色当时未链接到您的计算机,那么您就倒霉了。我有一个足够新的实例,我没有深入研究如何重新运行这些脚本,我相信这是可能的。当我终止我的实例并启动一个新实例时,密钥iam
突然出现在那里,aws cli 和 powershell 工具很顺利。