俺のアウトプット

調べたこと、試したことを書きます

AWS Cloud9 EC2環境を構築する

AWS Cloud9 は、ブラウザのみでどのマシンからでもコードを記述、実行、デバッグできる、クラウドベースの統合開発環境 (IDE) です。

とはいえ、何でもできるわけではありません。 基本はサーバーサイド向けです。
特にサーバーレスアプリケーション(Lambda)の作成、実行、デバッグが簡単になります。

サポートしているリージョン

AWS Cloud9がサポートしているリージョンは以下の5ヶ所です。

  • 米国東部 (バージニア北部)
  • 米国東部 (オハイオ)
  • 米国西部 (オレゴン)
  • アジアパシフィック (シンガポール)
  • EU (アイルランド)

東京リージョンはありませんが、Cloud9の設定画面で、Lambdaリソースのリージョンを変更できます。

日本から接続する場合は、レイテンシが小さいシンガポールリージョンがおすすめです。

【追記】2019/04/05 東京リージョンに対応しました。

環境作成

それでは、さっそく環境構築してみましょう。

サービス [開発者用ツール] - [Cloud9] を選択して、[Create environment]ボタンをクリックします。

f:id:kitsugi:20180908061524p:plain

環境名

環境名説明を入力して、[Next step]ボタンをクリックします。

f:id:kitsugi:20180908061533p:plain

環境名説明は、ダッシュボード(Your environments)画面の[Edit]ボタンから、いつでも変更できます。

環境設定

今回はデフォルトのまま[Next step]ボタンをクリックします。

f:id:kitsugi:20180908061542p:plain

  • 環境タイプ(Environment type)
    • 用意されたEC2インスタンスを起動するか
    • SSHで自分で用意したサーバーを指定するか
    • 後から変更不可能
  • インスタンスタイプ(Instance type)
    • 環境タイプにEC2を選択した時のインスタンスのタイプ
    • デフォルトはt2.micro
    • インスタンス停止中に [コンピューティング] - [EC2] - [インスタンス] から変更可能
      • [インスタンスの設定] - [インスタンスタイプの変更]
  • コスト削減のセットアップ(Cost-saving setting)
    • すべてのウェブブラウザインスタンスが閉じられてからEC2インスタンスがシャットダウンするまでの時間
    • デフォルトは30分後
    • シャットダウンしない場合はNeverを選択
    • Cloud9の設定画面から変更可能
      • [Project Settings] - [EC2 Instance] - [Stop my environment]

確認

問題がなければ[Create environment]ボタンをクリックします。
数分で起動します。

f:id:kitsugi:20180908061551p:plain

起動画面

起動直後の画面です。

f:id:kitsugi:20180909205717p:plain

IDE チュートリアル

メニューバー

表示/非表示

メニューバーの左端の矢印を選択して非表示、中央の矢印で表示ができます。

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/images/ide-hide-show-menu-bar.gif

ダッシュボード画面の遷移

[AWS Cloud9] - [Go To Your Dashboard]でダッシュボード(Your environments)画面に遷移できます。

f:id:kitsugi:20180909211835p:plain

ダッシュボード画面

f:id:kitsugi:20180909212632p:plain

プロセスリスト

[Tools] - [Process List] でプロセスリストを表示できます。

f:id:kitsugi:20180909213532p:plain

プロセスの停止、強制終了ができます。

環境ウィンドウ

環境ウィンドウには、フォルダとファイルが表示されます。
隠しファイルを表示するには、環境ウィンドウにある歯車アイコンを選択して、 [Show Hidden Files] 項目をチェックします。

f:id:kitsugi:20180909114630p:plain

隠しファイルが表示されます。

f:id:kitsugi:20180909115219p:plain

非表示にするには、再度 [Show Hidden Files] 項目をチェックします。

ターミナル

ターミナルウィンドウからEC2インスタンスに対して、各種コマンドを実行できます。

$ cat /etc/system-release
Amazon Linux AMI release 2018.03

$ uname -srv
Linux 4.14.62-65.117.amzn1.x86_64 #1 SMP Fri Aug 10 20:03:52 UTC 2018

AWS-CLIやgitも既にイントールされています。

$ aws --version
aws-cli/1.14.9 Python/2.7.14 Linux/4.14.62-65.117.amzn1.x86_64 botocore/1.8.13

$ git --version
git version 2.14.4

インストール済みのパッケージをアップデートします。

$ sudo yum -y update

右上のサイズ変更アイコンを選択すると、ターミナルを全画面表示にすることができます。
再度選択すると、元のサイズに戻ります。

f:id:kitsugi:20180910060637p:plain

参考

Bitbucket上のリポジトリをAWS CodeCommit上へ移行する

普段、趣味で書くコードはBitbucketを利用しています。
5ユーザーまでの制限はあるけれど、プライベートリポジトリを無料で利用できるのは嬉しいですね。

bitbucket.org

AWS CodeCommit にも無料枠があります。 これは期間限定ではなく常に無料です。

  • 無制限のリポジトリ
  • 5人のアクティブユーザー/ 月
  • 50 GB のストレージ/月
  • 10,000 回の Git リクエスト/月

個人で利用するには十分ではないでしょうか。

今回はこのBitbucket上のリポジトリをAWS CodeCommit上に移行します。

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/images/codecommit-migrate-existing.png

  1. AWS CodeCommitリポジトリを作成
  2. Bitbucketリポジトリをクローン
  3. AWS CodeCommitリポジトリにプッシュ

AWS CodeCommitの準備は、前回のエントリを参考にしてください。

1. AWS CodeCommitリポジトリを作成

まずはリポジトリを作成します。

マネジメントコンソールの場合

  • サービス [開発者用ツール] - [CodeCommit] を選択
  • リポジトリを作成するリージョンを選択(CodeCommitはリージョン単位のサービスです)
  • [リポジトリの作成]ボタンをクリック(はじめての場合は[今すぐ始める]ボタンをクリック)

f:id:kitsugi:20180905073301p:plain

[リポジトリの作成]ボタンをクリックします。

f:id:kitsugi:20180907055400p:plain

[スキップ]ボタンをクリックします。([設定] - [通知] からいつでも設定できます)

AWS-CLI の場合

作成

$ aws codecommit create-repository --repository-name MyRepository --repository-description "私のリポジトリ"
{
    "repositoryMetadata": {
        "cloneUrlSsh": "ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyRepository",
        "repositoryId": "a95590a1-9d4f-4e09-b562-1234567890ab",
        "repositoryDescription": "私のリポジトリ",
        "lastModifiedDate": 1536095543.38,
        "repositoryName": "MyRepository",
        "accountId": "123456789012",
        "cloneUrlHttp": "https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyRepository",
        "creationDate": 1536095543.38,
        "Arn": "arn:aws:codecommit:ap-northeast-1:123456789012:MyRepository"
    }
}

削除(参考)

$ aws codecommit delete-repository --repository-name MyRepository
{
    "repositoryId": "a95590a1-9d4f-4e09-b562-1234567890ab"
}

2. Bitbucketリポジトリをクローン

gitコマンドを利用して、Bitbucketリポジトリをローカル上にクローンします。

SSHの場合

$ git clone --mirror git@bitbucket.org:<account_name>/<repo_name>.git <ローカルリポジトリ名>

HTTPSの場合

git clone --mirror https://<username>@bitbucket.org/<account_name>/<repo_name>.git <ローカルリポジトリ名>

3. AWS CodeCommitリポジトリにプッシュ

クローンを作成したディレクトリに移動してgitコマンドでプッシュします。

$ cd <ローカルリポジトリ名>
$ git push ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/<AWS CodeCommitリポジトリ名> --all

上の例では、東京リージョンap-northeast-1になっています。
各リージョンのエンドポイントURLは、AWS CodeCommit のリージョンと Git 接続エンドポイントを参照してください。

Counting objects: 354, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (146/146), done.
Writing objects: 100% (354/354), 306.89 KiB | 38.36 MiB/s, done.
Total 354 (delta 203), reused 354 (delta 203)
To ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/OrenoRepository
 * [new branch]      develop -> develop
 * [new branch]      master -> master

Compressing objects: 100% (完了件数/全体件数), done.

と表示されていれば移行完了です。

AWS CodeCommit UIの確認

AWS CodeCommit ダッシュボードから作成したリポジトリを選択します。

f:id:kitsugi:20180907064628p:plain

シンプル過ぎて逆に清々しさを感じるUI。
そこにはかわいいタコ猫キモい狸はいませんでした。

f:id:kitsugi:20180905075455p:plain

f:id:kitsugi:20180907065226p:plain

参考

AWS CodeCommitリポジトリにSSH接続するための前準備

Code兄弟。
ちょっとずつ試してみたいと思います。
まずはバージョン管理サービスの CodeCommit から。

f:id:kitsugi:20180905055514p:plain

AWS CodeCommitに対する認証とアクセスコントロール

AWS CodeCommitはバージョン管理サービスです。

GitHubやBitbucketと同様に、リポジトリへのアクセスに認証情報が必要です。
CodeCommitでは、認証と権限にIAMユーザーを利用できます。

もちろん、SSH接続にも対応しています。 CodeCommitでは、IAMユーザーに対して、SSH公開鍵を紐づけることができます。

SSHキーの作成

まずはSSHキーを作成します。
ssh-keygenコマンドを使用してSSHキーを作成します。

$ cd ~/.ssh/
$ ssh-keygen -t rsa -b 4096 -f codecommit
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in codecommit.
Your public key has been saved in codecommit.pub.
The key fingerprint is:
SHA256:******************************************* user-name@client-name
The key's randomart image is:
+---[RSA 4096]----+
|        E.+.o*.++|
|        .o .=.=o.|
|       . ..  *. +|
|        ..o . +..|
|        So . . . |
|          .      |
|                 |
|                 |
|                 |
+----[SHA256]-----+

ファイルが2つ作成されます。

  • 秘密鍵: codecommit
  • 公開鍵: codecommit.pub

IAMユーザーの作成

IAMユーザーを作成し、先程作成した公開鍵のSSHキーを紐付けします。

サービス [セキュリティ、 アイデンティティ、 コンプライアンス] - [IAM] を選択します。 ナビゲーションペインの[ユーザー]を選択して[ユーザーを追加]ボタンをクリックします。

ユーザーを追加

ユーザー名とパスワードを入力して、[次のステップ: アクセス権限]ボタンをクリックします。

f:id:kitsugi:20180906062125p:plain

[既存のポリシーを直接アタッチ]ボタンを選択して、ポリシーのフィルタにAWSCodeCommitを入力して絞り込みます。

  • AWSCodeCommitFullAcces
    • 管理者用
  • AWSCodeCommitPowerUser
    • 一般ユーザー用(リポジトリの削除不可)
  • AWSCodeCommitReadOnly
    • 参照ユーザー用

ユーザーに適切なポリシーを選択します。
ここではAWSCodeCommitFullAccessポリシーを選択します。

[次のステップ: 確認]ボタンをクリックします。

f:id:kitsugi:20180906062651p:plain

確認画面で[ユーザーの作成]ボタンをクリックして、ユーザーを作成します。

SSHキーの紐付け

作成した[ユーザー名]リンクをクリックします。

f:id:kitsugi:20180906062141p:plain

[認証情報]タブを選択して、[SSH 公開キーのアップロード]ボタンをクリックします。

f:id:kitsugi:20180906063940p:plain

先程作成したSSHキーの公開鍵(*.pub)の中身をコピーして貼り付けます。

f:id:kitsugi:20180906070034p:plain

[SSH 公開キーのアップロード]ボタンをクリックします。

SSHキーIDが表示されるので、これをコピーしておきます。

f:id:kitsugi:20180906070531p:plain

SSH設定ファイルに追記

.ssh/configファイルに下記を追加します。configファイルがない場合は新規作成してください。

# CodeCommit
Host git-codecommit.*.amazonaws.com
  USER APKA****************
  IdentityFile ~/.ssh/codecommit 

最後に、設定ファイルのアクセス権を変更します。

$ chmod 600 config

これで準備が整いました。

SSH接続確認

設定が正しいか、SSHコマンドで確認します。

$ ssh git-codecommit.us-east-2.amazonaws.com
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.us-east-2.amazonaws.com closed by remote host.
Connection to git-codecommit.us-east-2.amazonaws.com closed.

You have successfully authenticated over SSH

と表示されればOKです。

参考

Fitbit APIをcurlで叩いてみた

Fitbitしていますか?

Fitbitとは腕につけて、歩数や心拍数、登った階数、カロリーなどを計測してくれるリスバンドタイプの活動量計です。

www.fitbit.com

自分は普段からFitbitを身に着けています。
とにかくよく歩きます。
アイデアを整理しながら歩いたり、たまに無になって歩いたり。。

f:id:kitsugi:20180903212213p:plain

記録を見ると、シベリア鉄道の全長を超えていました。
目指せ、世界一周ですね。

このFitbitはWeb APIが公開されており、自分のデータを取得することができます。

早速試してみましょう。

アプリケーションの登録

その前にアプリケーションを登録する必要があります。

https://dev.fitbit.com/apps/new

試すだけなので、URLはローカルホストにします。

項目
Application Name 任意
Description 10文字以上
Application Website http://localhost
Organization 任意
Organization Website http://localhost
Terms Of Service Url http://localhost
Privacy Policy Url http://localhost
OAuth 2.0 Application Type Personal
Callback URL http://127.0.0.1:8080
Default Access Type Read-Only

登録後、[OAuth 2.0 tutorial page]リンクをクリックします。

f:id:kitsugi:20180903230103p:plain

OAuth 2.0 チュートリアルページ

このチュートリアルページで、アクセストークンとリフレッシュトークン、およびFitbit API用のcurlコマンドを取得できます。

  1. Flow type を Authorization Code Flow に選択します。
  2. リンクをクリックします。

f:id:kitsugi:20180903230220p:plain

アクセス許可を求める画面が表示されるので、すべて許可するを選択して[許可]ボタンをクリックします。

f:id:kitsugi:20180903231029p:plain

Callback URLをローカルホストに設定しているため、サーバーに接続できずエラー画面が表示されます。

アドレスバー URL内にある40桁のコード値をクリップボードにコピーします。 末尾の#_=_は不要です。

http://127.0.0.1:8080/?code=0123456789012345678901234567890123456789#_=_

コピーしたコード値を、下図のCodeテキストボックス(1番)にペーストします。

トークン取得用のcurlコマンドが表示(2番)されます。 このトークン取得用のcurlコマンドをコピーします。

f:id:kitsugi:20180904053543p:plain

コピーしたトークン取得用のcurlコマンドをローカルのターミナル上にペーストしてcurlを叩きます。

$ curl -X POST -i -H 'Authorization: Basic **********' -H 'Content-Type: application/x-www-form-urlencoded' -d "clientId=******" -d "grant_type=authorization_code" -d "redirect_uri=http%3A%2F%2F127.0.0.1%3A8080" -d "code=**********" https://api.fitbit.com/oauth2/token
HTTP/2 200 
date: Mon, 03 Sep 2018 20:26:42 GMT
content-type: application/json;charset=UTF-8
vary: Origin,Accept-Encoding
cache-control: no-cache, private
content-language: ja-JP
x-frame-options: SAMEORIGIN
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 4518f4ac8f3e94d5-NRT

{"access_token":"**********","expires_in":28800,"refresh_token":"**********","scope":"nutrition heartrate social activity profile sleep weight settings location","token_type":"Bearer","user_id":"******"}

HTTPステータスコード 200が返ってきていたら成功です。 レスポンスボディのJSON結果をコピーします。

テキストエリア(3番)にJSON結果をペーストします。

アクセストークンとリフレッシュトークンが表示(4番)され、プロフィール取得用のcurlコマンドが表示(5番)されます。

curl -i -H "Authorization: Bearer **********.**********" https://api.fitbit.com/1/user/-/profile.json

curlを叩くとプロフィールが取得されます。 URL中の - はカレントユーザーを意味します。

このURLのprofile箇所を変更してcurlを叩くと、各種データを取得できます。

アクセストークンとリフレッシュトークンはプログラムからOAuth2.0認証を利用する場合に利用できます。

URLエンドポイント

いくつかのエンドポイントを見てみましょう。

エンドポイント 説明
activities/today 今日のアクティビティを取得
activities/steps/date/2018-09-03/1d 指定した日の歩数を取得
activities/steps/date/today/1m 1ヶ月分の歩数を取得
activities/heart/date/today/1d 今日の心拍数を取得
activities/heart/date/today/7d 1週間分の心拍数を取得
sleep/date/today 今日の睡眠データを取得
sleep/date/2018-09-01 指定した日付の睡眠データを取得
sleep/date/2018-08-01/2018-08-31 期間を指定して睡眠データを取得

他にも様々なコマンドやオプションがあります。
詳しい使い方は Web API Reference を参考にしてください。

サンプル

サンプルとして、昨日の歩数を取得してみます。

curl -H "Authorization: Bearer **********.**********" https://api.fitbit.com/1/user/-/activities/steps/date/2018-09-03/1d.json | jq .

そのままだとJSONが見づらいので、jq をパイプ連結して、結果を整形しています。

Macユーザーなら、更にパイプ連結でpbcopyを追加すると、クリップボードに直接コピーできます。

{
  "activities-steps": [
    {
      "dateTime": "2018-09-03",
      "value": "11758"
    }
  ],
  "activities-steps-intraday": {
    "dataset": [
      {
        "time": "00:00:00",
        "value": 0
      },
      略
      {
        "time": "08:00:00",
        "value": 25
      },
      {
        "time": "08:01:00",
        "value": 32
      },
      {
        "time": "08:02:00",
        "value": 16
      },
      略
      {
        "time": "23:59:00",
        "value": 0
      }
    ],
    "datasetInterval": 1,
    "datasetType": "minute"
  }
}

無事出力されました。
昨日は 11,758歩。平日なのでまずまずです。

参考

AWS認定DevOpsエンジニア-プロフェッショナルに合格しました

本日、AWS認定資格 DevOpsエンジニア-プロフェッショナル に合格しました。
今年の2月にAWS認定資格を取ろうと決心。コツコツと1個ずつ取得していきました。
(資格もアウトプットですね)

  1. AWS認定 ソリューションアーキテクト – アソシエイト (03/22)
  2. AWS認定 SysOps アドミニストレーター – アソシエイト (04/24)
  3. AWS認定 デベロッパー – アソシエイト (05/10)
  4. AWS認定 ソリューションアーキテクト – プロフェッショナル (06/30)
  5. AWS認定 DevOps エンジニア – プロフェッショナル (8/30)

これで5冠達成です。

自分はソフトウェア開発者なので、今回の DevOpsエンジニア – プロフェッショナル が、やはり1番嬉しいです。

資格を取得してよかったこと

資格を取得する過程で、体系的に勉強できたことが一番です。

例えば、IAMのロールやポリシー、Security Token Service(STS)に関して。
Amazon Cognitoの認証の仕組みがイマイチわからなかったのですが、STSを理解すれば仕組みが理解できます。

つらかったこと

本試験、模擬試験、全て実費だったので金銭的につらかったです。。。
妻にはAmazonで何か買ったと思われていますし。

ここからがスタートライン

認定資格を受けて感じたことは、少し古臭いと感じたことです。

当たり前ですが、クラウドは日々進化しています。
出来なかったことが出来るようになったり、新しいサービスが出てクラウドパターンが通用しなくなったり。

資格を取得したから終わり、ではありません。
AWS関連のニュースを日々キャッチアップして、知識をアップデートしていく必要があります。

そういった意味で、ここからがスタートラインです。

これからやりたいこと

サーバーレスアーキテクチャに興味があります。

また、以下のサービスが気になるので、ちょっとずつ勉強していこうかと思います。

  • Amazon API Gateway
  • AWS AppSync
  • Amazon EKS
  • Code兄弟
  • AWS Cloud9

Elastic BeanstalkのサンプルアプリでBlue/Greenデプロイを試す

Elastic Beanstalkにはデプロイ方式がいくつかあります。
今回は、ダウンタイム無しのURL Swapによる環境の切り替えを試してみます。

サンプルアプリ

サンプルアプリは、Amazon Elastic Beanstalk を使用したアプリケーションの起動 で利用しているPHPアプリを利用します。

公式サイトから http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/samples/php-v1.zip をダウンロードします。

ファイル構成

解凍してファイルの中身を確認します。

$ unzip php-v1.zip -d php-v1
$ tree -a php-v1
php-v1
├── .ebextensions
│   └── logging.config
├── cron.yaml
├── index.php
├── logo_aws_reduced.gif
├── scheduled.php
└── styles.css

設定ファイル用の .ebextensions という隠しフォルダがあります。アップロードする時は含める必要があるので注意しましょう。

1つめの環境作成

サービス [コンピューティング] - [Elastic Beanstalk] を選択。 [新しいアプリケーションの作成]ボタン をクリックします。

アプリケーションの作成

アプリケーション名を入力して、[作成]ボタンをクリックします。

f:id:kitsugi:20180829073214p:plain

環境の作成

[アクション]-[環境の作成]をクリックします。

f:id:kitsugi:20180829073237p:plain

環境枠の選択でウェブサーバー環境を選択します。

f:id:kitsugi:20180829073247p:plain

必要な項目を入力して、[環境の作成]ボタンをクリックします。

  • ドメイン:ユニークな環境URLを割り当てます
  • コードのアップロード:ダウンロードしたphp-v1.zipをそのままアップロードします

f:id:kitsugi:20180829073257p:plain

ヘルスがOKになるまで待機します。

f:id:kitsugi:20180829073310p:plain

URLを開いて、サンプルアプリが表示されることを確認します。

f:id:kitsugi:20180829073327p:plain

これで1つめの環境が出来ました。

2つめの環境作成

サンプルアプリの改修

ダウンロードしたサンプルアプリを少し変更します。

styles.css

section.instructions {
    display: block;
    padding: 50px;
    text-align: left;
    background-color: #0f0;  /*変更*/
    position: absolute;
    top: 0;
    left: 50%;
    right: 0;
    bottom: 0;
}

背景色を白から緑に変更しました。

index.php ファイルのあるディレクトリでファイルを圧縮します。

$ zip php-v2.zip -r .e* *

この時、隠しフォルダ.ebextensionsを含めるようにします。含めないとエラーになります。

※Windowsの人はアプリケーションを更新するを参考にしてください。

環境のクローン作成

作成した環境をコピーして、改修したサンプルアプリをデプロイします。
[アクション]-[環境のクローン作成]メニューを選択します。

ユニークな環境URLを割り当て、[クローン]ボタンをクリックします。

f:id:kitsugi:20180829073340p:plain

[アップロードとデプロイ]ボタンから、改修したサンプルアプリをアップロードし、[デプロイ]ボタンをクリックします。

f:id:kitsugi:20180829073350p:plain

URLを開いて、背景色が緑色になっていることを確認します。

f:id:kitsugi:20180829073430p:plain

これで2つめの環境が出来ました。

環境URLのスワップ

2つの環境のDNSレコードのCNAMEを切り替えます。
[アクション]-[環境URLのスワップ]メニューを選択します。

f:id:kitsugi:20180829073441p:plain

スワップする環境を選択して、[スワップ]ボタンをクリックします。

環境 スワップ前 スワップ後
1つめ aaa.xxx.elasticbeanstalk.com bbb.xxx.elasticbeanstalk.com
2つめ bbb.xxx.elasticbeanstalk.com aaa.xxx.elasticbeanstalk.com

1つめの環境のURLを開いた時に、背景色が緑色になっていることを確認します。

アプリに問題があれば、スワップして元に戻すだけです。
素晴らしいですね!

まとめ

Elastic Beanstalkを使うと、簡単にデプロイが出来て、簡単にダウンタイム無しにアプリを切り替えることが出来ます。

デプロイについては、冒頭の資料 AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalkと、下記のブログを一読することをおすすめします。 どちらもよくまとまっています。

aws.typepad.com

参考

CloudFormationテンプレートのDeletionPolicy属性

Resourcesセクション内のリソース定義時に、DeletionPolicy属性を指定すると、リソースの削除方法を制御できます。

DeletionPolicy属性は、リソースのふるまいや関連性を制御するリソース属性の1つです。

リソース属性

  • CreationPolicy 属性
  • DeletionPolicy 属性 (これ)
  • DependsOn 属性
  • Metadata 属性
  • UpdatePolicy 属性

DeletionPolicy属性のオプション

  • Delete
    • リソースを削除する
  • Retain
    • スタック削除しても、対象のリソースを削除しない
    • 残ったリソースはCloudFormationの管理外
  • Snapshot
    • リソースを削除する前にスナップショット作成
    • 対応リソース
      • AWS::EC2::Volume
      • AWS::ElastiCache::CacheCluster
      • AWS::ElastiCache::ReplicationGroup
      • AWS::RDS::DBInstance
      • AWS::RDS::DBCluster
      • AWS::Redshift::Cluster

デフォルトの動作

DeletionPolicy属性は省略可能です。
省略した場合はリソースが削除されますが、一部のリソースタイプはデフォルトの動作が異なります。

リソースタイプ デフォルトの動作
AWS::RDS::DBCluster Snapshot
AWS::RDS::DBInstance Auroraエンジン用のDBClusterIdentifierプロパティ
・指定する:Delete
・指定しない:Snapshot
それ以外 Delete

サンプルテンプレート

Amazon RDSのDBインスタンスを作成するテンプレートです。 リソースタイプ AWS::RDS::DBInstance の DeletionPolicy属性にRetainを指定しています。

スタック作成時に

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  DBUser:
    NoEcho: true
    Description: The database admin account username
    Type: String
    MinLength: 1
    MaxLength: 16
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: must begin with a letter and contain only alphanumeric characters.
  DBPassword:
    NoEcho: true
    Description: The database admin account password
    Type: String
    MinLength: 8
    MaxLength: 41
    AllowedPattern: '[a-zA-Z0-9]*'
    ConstraintDescription: must contain only alphanumeric characters.
Resources:
  MyDB:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyDatabase
      AllocatedStorage: 5
      DBInstanceClass: db.t2.small
      Engine: MySQL
      MasterUsername: !Ref DBUser
      MasterUserPassword: !Ref DBPassword
    DeletionPolicy: Retain
Outputs:
  JDBCConnectionString:
    Description: JDBC connection string for the database
    Value: !Join 
      - ''
      - - 'jdbc:mysql://'
        - !GetAtt 
          - MyDB
          - Endpoint.Address
        - ':'
        - !GetAtt 
          - MyDB
          - Endpoint.Port
        - /MyDatabase

スタックを削除すると、RDSを削除しないため、一瞬で完了します。 (残ったRDSは削除してください)

f:id:kitsugi:20180827075330p:plain

AWS::RDS::DBInstanceの場合、DeletionPolicy属性を削除するとSnapshotとして動作します。 この場合、スナップショットが残っているのが確認できます。

f:id:kitsugi:20180827080149p:plain

参考