gpt4 book ai didi

amazon-web-services - 云形成 : unable to recreate EC2 instance with the same ElasticIp

转载 作者:行者123 更新时间:2023-12-03 07:47:25 26 4
gpt4 key购买 nike

我正在尝试创建和更新由 1 个 EC2 实例和 1 个 EIP 组成的 CloudFormation 堆栈。

作为引用,我使用的是nodejs sdk。

这是粗略的模板(我编辑了部分内容并省略了输出):

{
AWSTemplateFormatVersion: '2010-09-09',
Description: '',
Parameters: {
ClusterStackName: {
Description: ...,
Type: 'String',
Default: ...,
},
AmiId: {
Description: ...,
Type: 'String',
Default: ...,
},
},
Resources: {
ElasticNetworkInterface: {
Type: 'AWS::EC2::NetworkInterface',
Properties: {
GroupSet: [...],
SubnetId: ...,
Tags: [...],
},
},
Instance: {
Type: 'AWS::EC2::Instance',
DependsOn: 'ElasticNetworkInterface',
Properties: {
ImageId: {
Ref: 'AmiId',
},
UserData: ...,
InstanceType: ...,
Tenancy: 'default',
KeyName: ...,
PropagateTagsToVolumeOnCreation: true,
BlockDeviceMappings: [
{
DeviceName: ...,
Ebs: { VolumeSize: 'x', Encrypted: true },
},
{
DeviceName: ...,
Ebs: { VolumeSize: 'y', Encrypted: true },
},
],
NetworkInterfaces: [
{
NetworkInterfaceId: { Ref: 'ElasticNetworkInterface' },
DeviceIndex: '0',
},
],
Tags: [...],
},
},
ElasticIpAddress: {
Type: 'AWS::EC2::EIP',
Properties: {
Domain: 'vpc',
InstanceId: { Ref: 'Instance' },
Tags: [...],
},
},
},
}

创建工作正常,我得到了带有网络接口(interface)和 EIP 的 EC2 实例。我希望能够在不丢失 EIP 的情况下重新创建机器,因此,例如,如果我更新 AMI 并更新相应的参数,则更新失败并出现错误:

Interface: [eni-aabbccdd] in use. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidNetworkInterface.InUse; Request ID: xxx; Proxy: null)

据我了解,发生这种情况是因为 CloudFormation 需要能够安全回滚。有更好的方法来实现这一目标吗?如果我创建 2 个网络接口(interface)(一个用于私有(private),一个用于公共(public))并仅分离公共(public)网络,这会起作用吗?

提前致谢

我尝试使用网络附件和 DependsOn 属性的某种组合,但无济于事

最佳答案

我的解决方案是添加一个辅助网络接口(interface),该接口(interface)将在重新创建实例时分离和附加。

要记住的最重要的事情是,在 AWS EC2 实例中,不能以任何方式分离主网络接口(interface) ( https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#:~:text=You%20cannot%20detach%20a%20primary,network%20interface%20per%20instance%20type. )

因此,CloudFormation 模板中的主要网络接口(interface)只能使用实例资源内的 NetworkInterfaces block 来完全指定。这一点至关重要,因为如果您以任何其他方式定义它(假设您创建一个 NetworkInterface 资源并在实例的 NetworkInterfaces 属性中引用它),CloudFormation 将尝试通过分离来保留它,而如果它完全包含在实例资源中,它将被删除并重新创建。

这也意味着在重新创建实例时保留私有(private) IP 地址的唯一方法是创建一个额外的 NetworkInterface,我们可以分离和附加该网络接口(interface),并且该计算机的“官方”私有(private) IP 地址将是分配给的地址辅助网络接口(interface)(eth1)。

每次重新创建实例时,主网络接口(interface)的私有(private) IP 地址都会发生变化,但辅助网络接口(interface)的 IP 地址(私有(private)和公共(public))将保持不变。

这样的事情对我有用:

{
AWSTemplateFormatVersion: '2010-09-09',
Description: '',
Parameters: {
ClusterStackName: {
Description: ...,
Type: 'String',
Default: ...,
},
AmiId: {
Description: ...,
Type: 'String',
Default: ...,
},
},
Resources: {
SecondaryElasticNetworkInterface: {
Type: 'AWS::EC2::NetworkInterface',
Properties: {
GroupSet: [...],
SubnetId: ...,
Tags: [...],
},
},
SecondaryNetworkInterfaceAttachment: {
Type: 'AWS::EC2::NetworkInterfaceAttachment',
Properties: {
DeviceIndex: '1',
InstanceId: { Ref: 'Instance' },
NetworkInterfaceId: { Ref: 'SecondaryElasticNetworkInterface' },
},
},
ElasticIpAddress: {
Type: 'AWS::EC2::EIP',
Properties: {
Domain: 'vpc',
Tags: [...],
},
},
ElasticIpAssociation: {
Type: 'AWS::EC2::EIPAssociation',
Properties: {
AllocationId: { 'Fn::GetAtt': ['ElasticIpAddress', 'AllocationId'] },
NetworkInterfaceId: { Ref: 'SecondaryElasticNetworkInterface' },
},
},
Instance: {
Type: 'AWS::EC2::Instance',
DependsOn: 'ElasticNetworkInterface',
Properties: {
ImageId: {
Ref: 'AmiId',
},
UserData: ...,
InstanceType: ...,
Tenancy: 'default',
KeyName: ...,
PropagateTagsToVolumeOnCreation: true,
BlockDeviceMappings: [
{
DeviceName: ...,
Ebs: { VolumeSize: 'x', Encrypted: true },
},
{
DeviceName: ...,
Ebs: { VolumeSize: 'y', Encrypted: true },
},
],
NetworkInterfaces: [
{
SubnetId: ...,
GroupSet: [...],
DeviceIndex: '0',
},
],
Tags: [...],
},
},
},
}

关于amazon-web-services - 云形成 : unable to recreate EC2 instance with the same ElasticIp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75574124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com