现在我在us-east-2b
可用区中有一个 EBS 存储卷。但是,我有一些代码可以自动执行创建实例的过程,并将其用作us-east-2
其可用区。问题是实例似乎是在它想要的任何可用区中创建的 -- us-east-2a
,us-east-2b
,us-east-2c
... 因此,当我尝试将卷附加到实例时,它会给我以下错误:
Aws::EC2::Errors::InvalidVolumeZoneMismatch (The volume 'vol-XXXX' is not in the same availability zone as instance 'i-XXXX')
为了提供一些一致性并避免出现此问题,我只想在特定的可用区域中创建一个实例,以便us-east-2b
它与 EBS 存储卷匹配。
aws-sdk
我也为此使用了 ruby 。知道这是否可行吗?
如果我尝试指定us-east-2b
,则会出现以下错误:
2.5.1 :080 > @ec2 = Aws::EC2::Resource.new(region: 'us-east-2b')
Traceback (most recent call last):
2: from (irb):80
1: from (irb):80:in `new'
ArgumentError (:region option must a region name, not an availability zone name; try `us-east-2' instead of `us-east-2b')
所以我不明白如何解决这个问题。我是否需要继续在xxx-2
可用区域中重新创建实例,直到我奇迹般地进入xxx-2b
?或者我是否需要找出另一种方法来不断来回复制快照,以便 EBS 存储卷在所有 3 个可用区域中保持一致us-east-2a/b/c
?
答案1
错过了文档中的一个步骤,然后意识到我可以指定一个具体的可用区(例如 2a、2b、2c),通过提供subnet_id
使用时.create_instance
例如:
instances = @ec2.create_instances({
min_count: 1,
max_count: 1,
image_id: @ec2_config[:image_id],
key_name: @ec2_config[:key_name],
security_group_ids: [@ec2_config[:security_group_id]],
instance_type: @ec2_config[:instance_type],
subnet_id: "subnet-xxxx" # availability zone us-east-2b (same as ebs volume)
})