amazon-web-services - ASG 无法再启动具有加密 EBS 根卷的实例
问题描述
我们最近部署了一个新应用程序,该应用程序使用配置为启动具有加密 EBS 根卷的实例的 ASG。我们有很多现有的应用程序都使用这种设置,但我们的新 ASG 拒绝启动实例。这些实例甚至都没有出现,我们在 ASG 活动历史记录中看到了一个错误:Client.InternalError: Client error on launch
。
经过实验,我们发现如果我们将我们正在使用的 AMI 换成未加密的 AMI,它就会开始按预期工作。令人困惑的是,我们在不同的 ASG 上使用完全相同的 AMI,而且一切都按预期工作(由几乎相同的 CloudFormation 模板组成)。同样,我们可以使用相同的 AMI 和实例配置文件直接从控制台启动 EC2 实例。
有没有人见过这种行为?
我在其他地方找到了一些解决方案(这使我们证明它与加密卷有关),例如来自 AWS的解决方案,但它们似乎与我们的场景没有直接关系。
解决方案
我们最终找到了一个 AWS 论坛帖子,其中详细介绍了服务相关角色 (SLR)。似乎在过去几个月的某个时候,他们改变了 ASG 的行为方式(仅适用于新创建的 ASG)。以前,ASG 可以使用任何 KMS CMK,但这已更改为只能访问默认密钥。我们正在使用“客户管理”的 CMK,因此我们新创建的 ASG 在默认情况下无法再访问它。
显然,这将在 6 月底之前对现有的 ASG 进行更改。
为了解决这个问题,我们着手创建一个可以访问我们的密钥的新 SLR,但后来发现 CloudFormation 还不允许您为 ASG 指定 SLR。
与此同时,我们决定通过更改 CMK 上的策略以允许从默认 SLR 进行访问,从而从本质上创造我们之前的情况。
我们用来创建 CMK 的 CloudFormation 现在如下所示:
KmsKey:
Type: AWS::KMS::Key
DeletionPolicy: Retain
Properties:
Description: Used to encrypt AMIs
EnableKeyRotation: True
KeyPolicy:
Version: 2012-10-17
Id: ami-kms-key
Statement:
- Sid: Enable IAM User Permissions
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
Action: kms:*
Resource: "*"
- Sid: Allow use of the key by the default service linked role
Effect: Allow
Principal:
AWS:
- !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling
Action:
- kms:Encrypt
- kms:Decrypt
- kms:ReEncrypt*
- kms:GenerateDataKey*
- kms:DescribeKey
Resource: "*"
- Sid: Allow attachment of persistent resources
Effect: Allow
Principal:
AWS:
- !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling
Action:
- kms:CreateGrant
Resource: "*"
Condition:
Bool:
kms:GrantIsForAWSResource: true
推荐阅读
- python-3.x - 未找到图像渲染器(点),不执行任何其他操作
- css - 响应式 div 小部件散景
- postgresql - 使用 PostgreSQL 更新 NESTED JSONB 数组中的对象
- php - 我将手机号码存储在数据库中,但有些手机号码存储如 954E+11,953E+11
- android - 如何使用多个部分和每个部分的数据源填充分页 RecyclerView?
- c# - 如何将标签控件保存为png图像
- java - 在android studio中单击原始文件夹中的ListView后,如何在第二个活动中从原始文件夹中播放多个音乐文件(.mp3)
- python - 我只想为列表中的每个元素获取相同的索引字母
- python - C 到 Python:For 循环
- google-apps-script - Google Spradsheet 中的 Concat 操作