无法将卷附加到EC2实例,grantAttachVolumeByResourceTag不清楚使用情况



我有一个bastion EC2实例,我试图将卷挂载到该实例上(我希望该卷即使在bastion替换时也能持续存在)。我读过文档,但他们往往有坏的非工作的例子摆在首位。我已经创建了Bastion和Volume,但是我无法将Volume附加到EC2实例。

这是我目前正在使用的代码(注意:我正在处理的一个更大的结构的一部分):

// Bastion
this.bastion = new Instance(this, 'Bastion', {
instanceName: 'BASTION-' + this._vpcName,
vpc: this.vpc,
vpcSubnets: {
subnets: [_bastionSubnet],
availabilityZones:[
Stack.of(this).availabilityZones[0] // Force to same as Volume
]
},
machineImage: MachineImage.latestAmazonLinux({
generation: AmazonLinuxGeneration.AMAZON_LINUX_2,
}),
instanceType: _instanceType,
role: bastionRole,
userData: UserData.custom(bootscript),
userDataCausesReplacement: true,
securityGroup: this.securityGroup_Bastion,
keyName: this._props.bastion.keyName,
blockDevices: [
{
deviceName: '/dev/xvda',
volume: BlockDeviceVolume.ebs(_rootVolumeSize, {
volumeType: EbsDeviceVolumeType.GP2,
}),
},
],
});
const _targetDevice = '/dev/xvdz';
// Create Volume
this.volumeBackups = new Volume(this, 'backupsVolume', {
availabilityZone: Stack.of(this).availabilityZones[0], // Force to same as Bastion
size: Size.gibibytes(200),
encrypted: true,
volumeName: _targetDevice
});
// Add attach access
this.volumeBackups.grantAttachVolumeByResourceTag(this.bastion.grantPrincipal, [this.bastion]);

到目前为止,我看到的是Bastion被创建了,Volume也被创建了。它们有预期的VolumeGrantAttach-<suffix>标签,它们都匹配。在检查AWS控制台时,我没有在实例的Storage选项卡下看到Volume。当我登录到实例并运行lsblk时,我没有看到可用的卷(只有我的根设备)。

$ sudo lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  30G  0 disk 
├─nvme0n1p1   259:1    0  30G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part 
在这一点上,我认为我错过了一个映射。我试图将其添加到堡垒blockDevices道具中,但这似乎不正确,因为类型不能一起工作。我甚至尝试将挂载添加到第一次运行的脚本中,但实例甚至无法识别它,我无法挂载它。

我仍然无法让卷挂载。我真的不知道还能做什么。

好的,这是非常直接的,但不容易找到如何正确地做到这一点。文档的例子不起作用…(抛出了一个错误,我现在想不起来)。

您需要使用AWS Cli在实例中挂载卷。考虑到我想让这项任务自动化,这是一个挑战,但我能够解决它。

我在自己的结构中使用typescript,所以我将尝试只显示我使用的命令,而不是实际的代码。

const _volumeId = 'vol-somerandomid';
const _targetDevice = '/dev/xvdz';
// I actually added a sleep for 2 mins here to ensure the volume is detached from a previous bastion instance. Otherwise you can, and will, get `VolumeInUse` error
// Attach VIA AWS CLI
aws --region ${Stack.of(this).region} ec2 attach-volume --volume-id ${_volumeId} --instance-id $(cat /var/lib/cloud/data/instance-id) --device ${_targetDevice}
// Verify it's attached
while ! test -e ${_targetDevice}; do sleep 1; done

一旦附加了,您仍然需要在第一次创建它时格式化它。这里的问题是,我如何让第一次运行解决这个问题?这是我能想到的:

首先,添加到fstab:

const _backupVolumeMountLocation = '/home/ec2-user/backups';
// Must create the mount point first
mkdir -p ${_backupVolumeMountLocation}

// Add to fstab
echo "'+`${_targetDevice} ${_backupVolumeMountLocation} ext4 defaults,nofail 0 0`+'" >> /etc/fstab

这是一个棘手的部分,因为它将尝试挂载卷,如果挂载失败,它将格式化。

sleep 1 ; mount -a && echo "Backups Volume already formatted and mounted" || (echo "Backups Volume is not formatted" && mkfs -t ext4 ${_targetDevice} && sleep 1 && mount -a && (chown -R ec2-user:ec2-user ${_backupVolumeMountLocation} && echo "Formatted backups volume") || echo "Failed to format and mount the backups volume" )

上面的命令被分解成这样的逻辑:

  • 休眠1秒-这确保在我们尝试挂载
  • 之前首先保存fstab。
  • 装入备份卷
    • 如果挂载没有失败:
      • 这将回显已格式化并挂载的备份卷
    • 如果mount失败:
      • 这将回显备份卷未格式化
      • 它将格式化卷
      • 它将挂载卷
        • 如果挂载没有失败:
          • 它将为新格式化的卷设置所有权
          • 这将回显格式化备份卷
        • 如果mount失败:
          • 这将显示格式化和挂载备份卷失败。

希望这对将来的其他人有所帮助。这对我来说不是很清楚如何正确地做这件事。

相关内容

  • 没有找到相关文章

最新更新