tjinjin's blog

インフラ要素多めの個人メモ

awscliやaws-sdkでEC2インスタンスのTermination Protectionの情報を取得できるか試す

About

今のところterraform(v0.6.3)を使ってもTermination Protectionは設定はできません。運用上どうしてもデータがたまってしまうサーバには間違えて削除できないように設定をしていますが、terraformで立てた環境については忘れがちです。なので、clisdk使って取得できるか確認しました。

Termination Protectionとは

EC2インスタンスを簡単にTerminateできなくする設定です。Termiinateするには一手間かかるので、間違って消すということを防ぐことができます。(Terraformでも削除できません)

AWS EC2インスタンスを簡単に消せないようにする方法 - Qiita

準備

どちらも環境変数が必要なので、direnvを使って環境変数を設定しておきます。(aws-sdkの2系からはどこかにcredencialをおいておけばよかったような気もします)

$ cat .envrc
export AWS_ACCESS_KEY_ID=XXX
export AWS_SECRET_ACCESS_KEY=YYY
export AWS_DEFAULT_REGION=ap-northeast-1

awscliを導入する

$ brew install awscli
$ aws help
# 何か出力されればok

aws-sdkを導入する

$ cat Gemfile
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem 'aws-sdk'

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/.............
Fetching version metadata from https://rubygems.org/..
Resolving dependencies...
Installing multi_json 1.11.2
Installing jmespath 1.0.2
Installing aws-sdk-core 2.1.20
Installing aws-sdk-resources 2.1.20
Installing aws-sdk 2.1.20
Using bundler 1.10.6
Bundle complete! 1 Gemfile dependency, 6 gems now installed.
Bundled gems are installed into ./vendor/bundle.

やってみる

aws cli

$ aws ec2 describe-instance-attribute --instance-id <instance-id> --attribute disableApiTermination
{
    "InstanceId": "<instance-id>",
    "DisableApiTermination": {
        "Value": true
    }
}

aws-sdk

[2] pry(main)> require 'aws-sdk'
=> true
[3] pry(main)> ec2 = Aws::EC2::Client.new(region: 'ap-northeast-1')
=> #<Aws::EC2::Client>
[4] pry(main)> ec2.describe_instance_attribute(instance_id: 'xxx' ,attribute: 'disableApiTermination')
=> #<struct Aws::EC2::Types::InstanceAttribute
 instance_id="xxx",
 instance_type=nil,
 kernel_id=nil,
 ramdisk_id=nil,
 user_data=nil,
 disable_api_termination=#<struct Aws::EC2::Types::AttributeBooleanValue value=true>,
 instance_initiated_shutdown_behavior=nil,
 root_device_name=nil,
 block_device_mappings=[],
 product_codes=[],
 ebs_optimized=nil,
 sriov_net_support=nil,
 source_dest_check=nil,
 groups=[]>

aws-sdkの方が見難いですが、一応取れてそうです。trueということは、Termination Protectionが設定されている状態になります。

そもそもですが、terraformを使っている以上設定しないほうがいいものなのでしょうかね。

参考リンク

describe-instance-attribute — AWS CLI 1.8.3 documentation

Class: Aws::EC2::Instance — AWS SDK for Ruby V2