AWS::EC2::Instance上でEBSボリュームを定義すると・・・
例えば以下のようにAWS::EC2::Instanceテンプレートで定義したEBSボリュームが
一部不要になったので削除しようとした。
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
...
BlockDeviceMappings:
## 以下ボリュームをコメントアウトで削除
# - DeviceName: /dev/sdb
# Ebs:
# VolumeSize: 30
# VolumeType: gp3
# DeleteOnTermination: "true"
# Encrypted: "true"
- DeviceName: /dev/sdc
Ebs:
VolumeSize: 5
VolumeType: gp3
DeleteOnTermination: "true"
Encrypted: "true"
これでスタック更新しようとしたら、ReplacementがTrueになってしまった。
公式レファレンス見ると、このテンプレートで作成したEBSボリュームに少しでも変更加えると強制的にインスタンスが置き換えられるという罠があった。
After the instance is running, you can modify only the DeleteOnTermination parameter for the attached volumes without interrupting the instance. Modifying any other parameter results in instance replacement.
勝手に置き換えられない方法がないかと調べたところ、AWS::EC2::Volume
という
テンプレートが用意されていた。
AWS::EC2::Volume
これとAWS::EC2::VolumeAttachment
を使ってEC2にアタッチすると、ボリュームサイズ変更や
ボリューム削除したい場合などに強制置換されずに設定変更を行えそう。
今後は、ボリュームを変更できるように、AWS::EC2::Volume
で別途定義したほうがよさそう。
ルートボリューム用EBSをアタッチする場合
EC2作成時、デフォルトでアタッチされたいるルートボリュームは暗号化されていない。
暗号化したかったので、暗号化済みのルートボリューム用EBSを別途作成してEC2にアタッチしようとした。
これも以下のようにCloudFormationテンプレートで作成したアタッチしようとした。
EC2Instance:
Type: "AWS::EC2::Instance"
...
RootVolume:
Type: AWS::EC2::Volume
Properties:
...
RootMountPoint:
Type: AWS::EC2::VolumeAttachment
Properties:
InstanceId: !Ref EC2Instance
VolumeId: !Ref RootVolume
Device: /dev/sda1
が、ルートボリュームだけ、いつまで経ってもアタッチ完了しない。。。
調べてみたが、原因は判明せず、仕方ないのでChatGPT先生に質問。
すると、ルートボリュームをアタッチしたい場合は、一旦EC2インスタンスを停止する必要があるらしい。
[Question]
EC2インスタンス(amazon linux)に作成したEBS /dev/sda1 をルートボリュームとしてアタッチ できないのですが、なぜですか。
[Answer]
Amazon Linux インスタンスにEBSボリュームをルートボリュームとしてアタッチする場合、いくつかの手順や考慮すべきポイントがあります。以下の点を確認してください:
...
インスタンスの停止: インスタンスのルートボリュームを変更するには、インスタンスを停止する必要があります。
...
試しにインスタンスを停止してしばらくすると、ルートボリュームがアタッチされた。
また、ルートボリュームとして外付けボリュームを使用する場合は、特定のデバイス名を使用する必要がある。
(OSによって名付け方は異なる)