AWS Snowball Edgeが我が家にやってきた。

概要

AWS Snowball Edgeを注文して自家用で使うべく注文した話です。
到着後に技術的に使用する話は別記事になっています

やっと来たSnowball

従来のAWS Snowballは専用のツールでデータを格納してS3とデータを出し入れするだけのストレージでした。
そこにAWS Snowball Edgeが登場。名前は似ているがこれは別物らしい。

NFS対応アップデート登場

AWS Snowball Edge登場当初は、ただのS3互換ローカルストレージでした。
2017年6月のアップデートでNFSサーバとして接続できるFile Interface機能が登場。
NFSサーバとしてローカルストレージにできる!?
申し込もう。

アマゾン時間

2016年内に全リージョンでGAとなるはずだったAWS Snowballなのに来る気配が無い。
2017年春、クローズドで一部パートナー等に出しているという話を聞くも自家用には借りられない。
2017年9月、やっと来た。
アマゾン時間はJSTと9ヶ月の時差があるようです。

申し込めないよSnowball

早速申し込もうとするもTokyoは日本の都道府県ではないと弾かれ申し込めません。
snow11.jpg

東京独立国構想も悪くないね!?
しかしどの都道府県を選択しても同じで申し込めず、サポートへ問い合わせ。

サポートからの返事は…
snow12.jpg

なんと言語設定をEnglishにして申し込んでくれというものでした。
ぶひー!!
(注:本不具合は2018年1月現在、修正済みです)

外人から連絡が><

申し込みを終えると、何やら外人からサポートケースを開かれ横文字で質問が来ました。
sn1.jpg

け!また横文字かよ。
しかも「質問に返答するまでSnowballを出荷しない」と書かれています。
ヤンキーらしいなぁ。
と思いつつ、後にこれに助けられることとなるのでここはおとなしく。

内容はSnowballはこういう仕様だけど、利用用途と環境に問題無いかという申し込みの確認です。
30TB程のデータがあり、スイッチには10Gbps RJ45とSFPポートがあるよと答えると、出荷の準備に入ると連絡が来ました。

大人気のSnowball Edge

しかし待てど暮らせど届かない。マネコンの状況も変化せず1週間。
サポートケースに更新がありました。
sn2.JPG

Snowball Edgeデバイスが大人気ですぐには出荷できないとのこと。
S3へデータを輸送するだけならこの注文をキャンセルして50TBか80TBのSnowballを注文してくれと書かれています。
それでは意味がないですし、来月のJAWS FESTA向けのネタなので急ぎませんから気長に待つことにします。

それは突然に

大人気で出荷できないよと連絡が来た翌日はJAWS-UG長野をリブートしに出かけていました。
長野の支部長と信州盛りの大量に盛られた蕎麦を食べていると、かーちゃんから怒りの電話が。
 「あんたまたアマゾンに何頼んだの。大きい荷物が届いたけど重くて動かせないよ」
と怒っています。

何か注文した記憶はありません。
ん!?!?
まさかとマネコンを開くと。。。

sn3.jpg
配達済みとか書かれています。
どうやらそのようです。長野遠征中につき2日間おあずけとなりました><

普通の宅配便として届くSnowball

日通警備さんとかが警備しながら持ってくるのかなと思いきや、宅配便の荷物として普通に届きました。
日本では西濃運輸さんが担当されているようです。
sn4.jpg

アクティベーションしないと使えませんし、配送は適当でも問題ないのでしょうね。
メソさんのブログによると欧州では玄関先に放置配達されたようですし対面受取なだけ日本はマシかも?

しかも外箱などは無く、筐体へ配達伝票と納品書がそのまま貼り付けられて届きます。
確かに物理的衝撃に強い構造ですから梱包不要でしょうけど、なんか面白いですね。

Eインクは?

上部にはEインクの表示パネルがあり、配達先等が表示されています。
sn5.jpg

電源が無くても光るんですね。背面のバックライト?はずっと光っていました。
しかし西濃運輸さんが非対応なのか、通常の宅配伝票が筐体側面に貼られています。

開封の儀

SnowBall Edgeには3つの扉があります。

上部を開くと電源ケーブルが収納されているのでこれを取り出します。
sn6.jpg
付属品はこれだけです。
ネットワークケーブルは必要な物を自前で準備しなければなりません。

背面を開くとネットワークポートと電源コネクタがあるので、ネットワークケーブルと先ほど取り出した電源ケーブルを接続します。
sn7.jpg
図解で「電源接続時は蓋を上げた状態で使用し閉じるな」と書かれています。

当然ですよね。
sn8.jpg
開けるとこの状態です。
これを閉じて使用したら発熱ですぐに熱暴走することでしょう。

前面を開くと電源スイッチと操作パネルがあります。
sn9.jpg
電源ボタンを押すと動き出します。

中身はHDDだった

ゴゴゴゴゴゴとHDD駆動音らしき音がします。
どうやらSSD等の半導体記憶媒体ではないようです。
衝撃に耐えるのは停止状態のみで良いわけですから、HDDでも要件を満たせますからね。

返却もふつうの宅配便

使用後に電源を切ると、筐体上面のEインクは返送用の宛名ラベルになります。
sn10.jpg

しかし、これまたEインク非対応であります。米国のみのようですね。
同梱されている西濃運輸さんの印字済み伝票を筐体に貼り付けます。
sn11.jpg

あとは普通の宅配便同様、西濃運輸さんへ集荷を依頼します。
いつもの運ちゃんが集荷に来て回収されます。

返却処理には時間がかかる

AWSのデータセンタは非公開のため、西濃運輸さんの拠点へ届けられます。
その後、AWSへ輸送されますがこの一連の処理が完了するまで1週間かかります。
sn15.jpg
処理が完了すると、マネコンのジョブステータスが完了済みとなり終了します。

料金の計算方法

Snowball Edgeは300ドルの基本料金に10日間の利用期間が含まれています。
届いた当日と、集荷された日は利用日に含まれません。
届いた翌日から集荷される前日までが利用期間となります。
よって、今回のように不在なのに家族が受け取ると残念なことになります。
また、送料別途で往復で120ドルかかりますから最低利用料金420ドルと覚えておきましょう。

まとめ

どんな物流なのか楽しみにしていましたが、普通の宅配便で届くことがわかりました。
一般のご家庭にも安心して注文できますね。一家に一台 AWS Snowball Edge.
利用開始後の技術的な話は別記事になっています

続きを読む

t2.microインスタンスでWindowsは使い物になるのか?

ICDP(田舎クラウドデザインパターン)的なネタ再び。

概要

AWS EC2 t2.micro インスタンスのシステム資源は非常に乏しい。
AWS無料利用枠でウィンドウズも対象だけど、本当に使い物になるのか?

目的

t2.microインスタンスへWindows Server 2008R2をインストールしてソフトウェアを起動しようとしたところ、 Out of Memory で起動不能であった。
メモリ1GB、連続して演算できない制限付きのCPU能力で、ウィンドウズを使用するには厳しい。
動作させたいソフトウェアは必要メモリ500MBのため、なんとか使えるようにすることを目的とする。

要件

  • AMI
    Windows_Server-2008-R2_SP1-Japanese-64Bit-Base-2017.11.29 – ami-95d06bf3

  • ページファイル(スワップ)無しで使う。
    スワップが発生したら実用にならないためページファイルは無しとする。
    これはスワップ処理にはCPU時間を消費するため、CPU時間に制限があるt2系インスタンスでは動作が間欠的に停止したり、操作不能に陥ったりするからである。

現状

Windows Server 2008R2 をインストールして起動した状態はこのようになっている。
t2a.jpg

消費メモリは959MB。
メモリ1GBしか無いのに消費メモリがこの状況では無理もない。殆ど空きがない。
40MBではメモリ不足で起動不能となるのは当然であろう。

対処

タスクマネージャでメモリ使用状況を見て削減できそうなプロセスを調べる。
t2b.jpg

TrustedInstaller.exe が460MBも使用している。
これは何かと調べると、Windows Modules Installerサービスのようだ。
Windows Update関連のプログラムで、停止させると更新に失敗するが通常は問題無いので停止させてみた。

無効に設定したサービス

先の大物を含め、無効に設定したサービスは以下の通り。
ただしこれを行うとWindows Updateが失敗するので行う場合は手動で起動し対処すること。

  • Windows Modules Installer
  • Windows Update
  • WinHttp Web proxy Auto-Discovery Service

また、AWSオリジナルの制御機能を使わないのであれば以下も無効にできる。
こちらは計20MB程度の削減にしかならないのでお好みで。

  • Amazon SSM Agent
  • AWS Lite Guest Agent
  • Ec2Config

対処した結果

t2c.JPG

消費メモリが400MB程度となり、600MBの空きを確保できた。

結論

かろうじて要件を満たし動作可能な環境を構築できた。
しかし、リソースには余裕が無いためMackerel等で常時監視した方が良いと思われる。

続きを読む

AWS Snowball Edge を自家用で使ってみた話

概要

AWS Snowball Edgeが我が家にやってきた。その顛末記。
s0.jpg

目的

AWS Snowball EdgeはAWSと関係なく単なるローカルストレージとして使えること着目し、
NASのデータ退避場所として使用する。データ退避後にNASエンクロージャに入っている
全HDDを交換し、NASの容量増加することを目的とします。

利用開始まで

  • ネットワークへ接続する
    ネットワーク接続はQSFP(40G), SFP+(25G), RJ45(10G)からの択一です。
    付属品は電源ケーブルしかありません。必要なケーブルは自前で準備が必要です。
    ボンディングなどは出来ず、いずれか1つのインタフェースのみ利用可能です。

  • 電源を入れる
    電源を入れると1Uサーバのような音がします。
    最初は高回転で動き出すのでなかなかの轟音です。数分すると静かになります。
    起動中は前面パネルに図解でSnowball Edgeの使い方が表示されています。
    起動完了まで5~6分かかります。

  • Snowball利用環境の準備
    公式サイトからSnowball toolをダウンロードします。(Linux,Mac用などあり)
    次に、AWSマネジメントコンソールへみんな大好きrootアカウントでログインします。
    Snowballサービスの画面に表示されているアンロックコードをメモします。
    マニフェストファイルをダウンロードしてSnowball toolを実行する端末に保存します。

  • Snowballのアンロック
    準備が出来たら端末でアンロックコマンドを実行します。
    Snowball Edgeはアンロックしないと利用できません。初回のみならず起動時に毎回必要です。
    -m にダウンロードしたマニフェストファイルを、-u にアンロックコードを指定します。

コマンド
snowballEdge unlock -i 10.0.0.1 
  -m ./JID20000000-7777-4444-aaaa-099999999999_manifest.bin 
  -u aaaaa-bbbbb-ccccc-ddddd-eeeee
      The Snowball Edge unlock status is: UnlockSnowballResult(status=UNLOCKING)

アンロックまで1分ほど、File Interface (NFSサーバ)が動き出すまで5分ほどかかります。
状態はSnowball Edge筐体の画面表示、またはコマンド実行で確認できます。

コマンド
snowballEdge status -i 10.0.0.1 
  -m ./JID20000000-7777-4444-aaaa-099999999999_manifest.bin 
  -u aaaaa-bbbbb-ccccc-ddddd-eeeee
      Snowball Unlock Status: SUCCESS
      Total Capacity: 90 TB
      Free Space: 90 TB
      S3 Endpoint: http://10.0.0.1:8080

以上で利用開始の準備完了です。

File Interface (NFSサーバ) の起動

起動しただけではS3としてしか使用できませんNFSサーバは手動で有効にします。
これはSnowball Edge筐体を操作して行います。
タッチパネルになっている画面のFileInterfaceを押します。Status の横にある Enable ボタンを押します。
Allowed clients の横にあるプルダウンメニューを押し、Snowball Edge申込時に入力したS3バケット名が選択肢にあるのでこれを選ぶだけです。

snow1.jpg

File Interface の表示が Running になっていればOKです。
これでNFSサーバとして動作するようになりました。

  • 注意事項

納品書と一緒に注意書きが入っていました。
「FileInterfaceとS3 Interfaceは同時に利用しないこと」
とあった。排他処理とかうまくいかないのでしょうね。まぁNFSでしか使わないので。

NFSマウントする

あっさりとNASでマウントできます。

コマンド
mount -o nolock 10.0.0.1:/nas-migration /mnt
df
Filesystem           1K-blocks      Used Available Use% Mounted on
10.0.0.1:/nas-migration
                     9007199254740992         0 9007199254740992   0% /mnt

実容量90TBのはずなのに、表示は見慣れた8EB(エクサバイト)です。EFSと同じですね。
納品書に同梱されていた注意書きに「空き容量のないSnowballへ書き込まないで下さい」とあります。
たぶんエラー対策がされておらず、おかしなことになるのでしょう。

気になったこと

  • まだ荒削りな実装
    書き込んでも書き込んでもNFSとして容量を取得すると使用済み容量0バイト、空き容量8EBのままです。
    使用済み容量はSnowball Edge本体のパネルに表示されているのを見るしか確認方法がありません。
    わざわざ紙の注意書きがあったのはそういうことか。はまった人が多いのでしょうね。

  • 速度が出ない
    NFSで書き込みをすると300Mbps程度しか出ません。30TBのファイルをコピーするのに14日かかる計算です。
    気が遠くなってきました。

トラブル発生

File Interfaceへしばらく書き込んでいると応答しなくなるトラブル発生。

[84182.336191] nfs: server 10.0.0.1 not responding, timed out
[84182.343201] nfs: server 10.0.0.1 not responding, timed out
[84182.349348] nfs: server 10.0.0.1 not responding, timed out

もうこのメッセージは見たくなかった。。。NFSの辛み再び。

NFSで書き込むと、File Interfaceが接続を受け、Snowball Edgeへ非同期で書き込みます。
このタスクが何時間待てど終了しない。このためシャットダウンもできない。

snow2.jpg

File InterfaceをDisableしようとしても書き込みが完了しないのでずっとこの状態です。

電源ボタンを押すとシャットダウン処理が行われます。
しかし、再び電源を投入するとこの状態から復活してもちろん利用不可能状態なのでした。

そしてサポートへ

日本のサポートは有償でないと答えられないという。使えないAWSJに見切りをつけ米国AWSへ。
カスタマーセントリックがきちんとしている米国は親身に対処してくれました。
30/30/30リブートなど様々な方法を教えられ試せど問題は解決せず。

不具合により動作しなかったため返送することなりました。
利用料金は後日$420のクレジットが付与される形で返還されました。

File Interfaceの不具合だった

返却まで数日あったので、不具合の原因究明に向け調査を続けました。

S3 Interfaceは問題ない

Snowball EdgeにはS3のローカルエンドポイントとして接続できる機能もあります。
これで読み書きを行うと問題なく行えます。
やはり原因はFile Interface機能のようです。

マルチバイト文字非対応のFile Interface

その後、ANK文字のみのファイルを書き込む限りはNFSでも問題無いことが確認できた。
日本語ファイル名など、マルチバイト文字を含むファイル名を使用するとFile Intefaceが暴走し使えなくなるという不具合なのだった。

サポートへフィードバック

snow3.jpg

ベーシックサポート(無償)でもちゃんとフィードバックされます。
これが当然ですよね。

利用料金

AWS Snowball Edgeは最初の10日間は300ドルです。これを超えると1日あたり30ドルかかります。
これはウェブサイトにも明記されていますが、送料は明記されておらず返却時に請求されます。
snow4.jpg

東京都内へ発送してもらいましたが、往復送料として120ドル請求されました。
つまり最低利用料金は420ドルということになります。送料が全国一律かは不明です。

結論

上記不具合により目的は達成されませんでした。
用途の都合上、ファイル名を変更することは出来ませんから仕方有りません。
AWS Snowballチームへ不具合をフィードバックしたし改善される日を待つことにします。

日本法人(AWSJ)の問題

使い方などを質問するのに有償サポートが必要なのであれば仕方ないでしょう。しかしです、
買った製品が正しく動作しないことについて連絡しても門前払いするAWSJの対応は問題です。
カスタマーセントリック思考が欠如し迷走するAWSJ。悔い改めよ。

続きを読む

AWS一括請求(Organizations)とクレジット(クーポン)共有・その使用権

AWS一括請求でクレジットを共有する場合(デフォルト)、はまった話です。

前提

親アカウントAに、子アカウントB・子アカウントCがぶらさがっています。
アカウントA,B,Cにはそれぞれ100ドルのクレジットが1つずつ付与されています。
全アカウントでEC2インスタンスが稼働しており日々課金が発生しています。

事象はこうして起こった

アカウントBを月の途中で一括請求から脱退します。
上記100ドルのクレジットはアカウントBのクレジットですから
一括請求脱退後も自分のアカウントの物のはずです。
実際マネコンで確認するとクレジットは残っています。

しかし、月が変わるとアカウントBに請求が届きました。
一括請求脱退後30ドル程度しか使っていないはずなのに何故…
これはおかしいと確認すると、一括請求グループに使われていたのでした。

クレジットの使用権

クレジットは最初に消費したアカウント(グループ)に使用権が属するようです。
つまり一括請求脱退時に残額が残っていても、それは自分の手元に戻らない。
脱退前の一括請求グループに使用権が残り続ける。
これは困りましたね。。。

AWSクレジットの問題点

本件を含めAWSクレジットの問題点を挙げておきます。

  • 複数登録されているとランダムに使用され虫食い状態になる
  • 有効期限の近い順に消費してくれない

1つめが今回の事象の原因です。
一括請求グループに存在するクーポン全体でランダムに使用されるためこのようなことに。
親アカウントの物から順番にとまではいかなくても、せめて1つのクレジットを使い始めたらそれを使い果たすまで他のクレジットに手を付けないといった仕組みが欲しいですね。

2つめも結構問題です。
今月末で期限切れとなるクレジットがまだ残っているのに、他のクレジットが使われることが。
そして使われないまま消えていったクレジットがあります。

まとめ

一括請求まわりは非常にややこしいです。
加入・脱退する場合は請求を日々確認するようにしましょう><

続きを読む

カテゴリー 未分類 | タグ

洋物のAmazon Echo Dotで日本語のスキルは使えるのか

目的

アメリカで発売され1年以上が経過し、ようやく日本にもやってきたAmazon EchoとAmazon Echo Dot。
歴史的理由でそんな洋物をお持ちの方も多いのではないでしょうか。
こういう製品は少品種大量生産でコスト削減が基本。
アマゾンが無駄なコストなどかけるはずがなく、世界中どこで買っても同じ製品だから日本語で動作するはず。
これを検証することを目的とします。

日本語に変更できるけど…

去年からAlexaを使っている人は管理画面でEchoの言語設定を変更できます。
ここに従来は存在しなかった「日本語」が出現しました。
arakisan.jpg
日本語を選択すると、警告が表示されるものの日本語対応になります。

「あれくさ」と日本語読みで発音してもきちんと反応しますし、
「今日の天気は?」と話しかけるときちんと登録住所地の天気を答えてくれます。
しかしです。
「スキル」が使えないんですね。
Alexa管理画面でスキルのページを開くと日本語のスキルが表示されないどころか、言語の問題で使えないよと英語のスキルも弾かれ詰みます。
警告されたのはこのためだったのでした。

Alexaのアカウントと言語の関係

アカウントの言語とデバイスで利用可能なスキルの言語は紐付いています。
そしてアカウントの選択可能な言語はアカウントを作成したサイトに依存します。

以前から使っているみんなが登録したのは
https://alexa.amazon.com/
ですよね。これはAWSアカウント(つまりアメリカのamazon.com)のアカウントです。

そこに、今回の日本語対応で別のサイトが出現しました。
https://alexa.amazon.co.jp/
文字通り日本のamazon.co.jpが管理しています。
こちらはAWSアカウントとは無関係です。日本のamazon.co.jpで買い物をするアカウントと同じ物で、それがそのまま利用可能です。

  • 日本語のスキルは日本のamazon.co.jpアカウントにデバイスを登録しないと使えないのでした

デバイスを日本のアカウントへ移動

デバイスは1つのアカウントにしか登録できません。
アメリカのアカウントから登録を解除して日本のアカウントへ登録する必要があります。
これはとても簡単です。
アメリカのAlexa管理画面 https://alexa.amazon.com/ を開き、
「設定」から一番上に登録デバイスが並んでいるので解除したいデバイスを選択。
「その他」の欄に「登録解除」というボタンがあります。
これをクリックすれば登録解除されます。

Echoが登録解除され利用不可能になっているはずです。

次に、日本のAlexa管理画面 https://alexa.amazon.co.jp/ へ接続します。
日本のアマゾンで買い物をするときに使用するアカウントでログインできます。
最初のログインでは、登録電子メイルアドレスに認証コードが送られます。
認証コードを入力すると利用可能になります。
あとは新規デバイスとしてEchoを登録するだけです。

できたかな?

ArakiSkill.jpg

こんな感じに画面が表示されれば成功しています。

まとめ

最初に立てた仮説が正しかったことが検証されました。
これを何に使うのかとかは興味がありません。そういった記事が書かれることは無いでしょう:-)

今回はAWS re:Inventで配られたAmazon Echo Dotで検証しています。
古いEchoは日本語非対応との話もあり、対応機と非対応機があるようです。
情報お待ちしています。

続きを読む

[JAWS-UG CLI] ACM入門 #15 Route53の削除

これはAWS Certificate Manager (ACM)入門ハンズオン資料の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。第1項へ進んでください

0. 準備

0.1. HostedZoneIdの変数への格納

コマンド
HOSTED_ZONE_ID=`aws route53 list-hosted-zones 
 --query HostedZones[].Id --output text` && echo ${HOSTED_ZONE_ID}
結果(例)
      /hostedzone/Z1S92TCRCPLEYH

1. Route53レコードセットの削除

1.1. レコードセットの削除

Route53のゾーン(ドメイン)削除するには、全ての登録したレコードを削除しなければなりません。
レコードセット登録時に使用したJSONファイルのCREATEをDELETEに置換することで再利用可能なので、これにより削除を実行します。
複数のファイルを同時には処理できませんから、順次作業します。

(1回目)

コマンド
cat ./route53.json | sed -e 's/CREATE/DELETE/g' > ./route53delete.json
aws route53 change-resource-record-sets 
 --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file://route53delete.json
結果(例)
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "Comment": "SESincoming",
              "SubmittedAt": "2016-11-03T05:17:25.761Z",
              "Id": "/change/CWGAZK7G2ILU4"
          }
      }

(2回目)

コマンド
cat ./route53b.json | sed -e 's/CREATE/DELETE/g' > ./route53delete.json
aws route53 change-resource-record-sets 
 --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file://route53delete.json
結果(例)
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "Comment": "AliasRecord",
              "SubmittedAt": "2016-11-03T06:52:06.554Z",
              "Id": "/change/C385JS8Z5GJZAB"
          }
      }

(CloudFrontまでの方は次の3回目は不要です。こちらはALBまで構築した方のみ)

コマンド
cat ./route53c.json | sed -e 's/CREATE/DELETE/g' > ./route53delete.json
aws route53 change-resource-record-sets 
 --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file://route53delete.json
結果(例)
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "Comment": "ALB-AliasRecord",
              "SubmittedAt": "2016-11-03T06:52:06.554Z",
              "Id": "/change/C385JS8Z5GJZAB"
          }
      }

ここまで実行したら1分程度待ちます。
(レコードセットの削除が完了しないとゾーンを削除できないからです)

1.2. レコードセット削除の確認

コマンド
aws route53 get-hosted-zone --id ${HOSTED_ZONE_ID} --query HostedZone.ResourceRecordSetCount
結果
      2

出力結果が 2 でない場合は、もう1分程度待って再度実行します。
それでも変わらない場合、レコードセットの削除に失敗していますから確認してください。

2. Route53ホストゾーンの削除

2.1. ゾーンの削除

コマンド
aws route53 delete-hosted-zone --id ${HOSTED_ZONE_ID}
結果(例)
      {
          "ChangeInfo": {
              "Status": "PENDING",
              "SubmittedAt": "2016-11-03T06:55:05.380Z",
              "Id": "/change/C3RGFWB23BB5L7"
          }
      }

2.2. ゾーンが削除されたか確認

コマンド
aws route53 list-hosted-zones
結果
      {
          "HostedZones": []
      }

懇親会へ行きましょう!

以上で本日のハンズオンは片付けまで全て終了です。
おつかれさまでした。荷物を片付けて懇親会へ行きましょう。

注意

Route53には無料利用枠が有りません。
削除し忘れると課金され続けます。きちんと削除の確認をするようにしましょう。

続きを読む

[JAWS-UG CLI] ACM入門 #14 SESの削除

これはAWS Certificate Manager (ACM)入門ハンズオン資料の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。第1項へ進んでください

0. 準備

0.1. リージョンの決定

今回はバージニア(us-east-1)リージョンで作業します。

変数の設定
export AWS_DEFAULT_REGION='us-east-1'

0.2. ドメイン名の変数への格納

変数へドメイン名を格納します。
ここでは example.tk とします。自分のドメイン名に読み替えてください。

コマンド
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
結果(例)
      example.tk

0.3. ルールセット名の変数への格納

SES Incoming作成時に設定した名前を変数へ格納します。

コマンド
SES_RULE_SET_NAME='S3spool' && echo ${SES_RULE_SET_NAME}
結果(例)
      S3spool

1. SES Incomingの削除

1.1. 受信ルールセットの無効化

ルールセットを削除するには、まず無効化する必要があります。

コマンド
aws ses set-active-receipt-rule-set
結果
      返り値なし

1.2. 受信ルールセットの削除

受信ルールセットを削除します。
ルールセットを削除すると、関連するルールも自動的に削除されます。

コマンド
aws ses delete-receipt-rule-set --rule-set-name ${SES_RULE_SET_NAME}
結果
      返り値なし

1.3. 削除されたか確認

コマンド
aws ses list-receipt-rule-sets
結果
      {
          "RuleSets": []
      }

2. SES ドメイン認証情報の削除

2.1. ドメイン認証情報の削除

コマンド
aws ses delete-identity --identity ${DOMAINNAME}
結果
      返り値なし

2.2. 削除されたか確認

コマンド
aws ses list-identities
結果
      {
          "Identities": []
      }

続きを読む

[JAWS-UG CLI] ACM入門 #13 ACM証明書の削除

これはAWS Certificate Manager (ACM)入門ハンズオン資料の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。第1項へ進んでください

0. 準備

0.1. ACM証明書arnの変数への格納

証明書のarnを変数 CERT_ARN へ格納します。

コマンド(例)
CERT_ARN=`aws acm list-certificates --region us-east-1 
 --query CertificateSummaryList[].CertificateArn 
 --output text` && echo ${CERT_ARN}
結果
      arn:aws:acm:us-east-1:777777777777:certificate/9eb6865a-63a3-48df-92c2-ae113c877b33

1. ACM証明書の削除

1.1. 証明書の削除

コマンド
aws acm delete-certificate --region us-east-1 --certificate-arn ${CERT_ARN}
結果
      返り値なし

ここで An error occurred (ResourceInUseException)のようなエラーが出た場合は、何らかのサービスでまだこの証明書が使用されています。
利用中のACM証明書は削除することができません。
CloudFrontやELBなどを確認して先に削除してから再実行してください。

1.2. 削除されたか確認

コマンド
aws acm list-certificates --region us-east-1
結果
      {
          "CertificateSummaryList": []
      }

続きを読む

[JAWS-UG CLI] ACM入門 #12 S3バケットの削除

これはAWS Certificate Manager (ACM)入門ハンズオン資料の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。第1項へ進んでください

0. 準備

0.1. ドメイン名の変数への格納

ここでは example.tk とします。自分のドメイン名に読み替えてください。

コマンド
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
結果(例)
      example.tk

0.2. コンテンツ配信用S3バケット名の変数への格納

S3バケット名を www.ドメイン名 とします。(例: www.example.tk

コマンド
WEB_S3_BUCKET="www.${DOMAINNAME}" && echo ${WEB_S3_BUCKET}
結果
      www.example.tk

0.3. SES Incoming用S3バケット名の変数への格納

S3バケット名を ドメイン名.sesincoming とします。

コマンド
SES_S3_BUCKET=${DOMAINNAME}.sesincoming && echo ${SES_S3_BUCKET}
結果
      example.tk.sesincoming

1. S3バケットの削除

1.1. コンテンツ配信用S3バケットの削除

S3バケットを削除します。
オブジェクトが残っていますから –force オプションで同時に全て削除します。

コマンド
aws s3 rb --force s3://${WEB_S3_BUCKET}
結果
      delete: s3://www.example.tk/index.html
      remove_bucket: www.example.tk

1.2. 削除されたか確認

コマンド
aws s3 ls s3://${WEB_S3_BUCKET}
結果
      An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist

このようにエラーとなれば削除完了しています。

1.3. SES Incoming用S3バケットの削除

S3バケットを削除します。
オブジェクトが残っていますから –force オプションで同時に全て削除します。

コマンド
aws s3 rb --force s3://${SES_S3_BUCKET}
結果(例)
      delete: s3://example.tk.sesincoming/ljfdsfdsodfsojfdsojfdslkdfljfdlkslkd9fdj
      remove_bucket: example.tk.sesincoming

1.4. 削除されたか確認

コマンド
aws s3 ls s3://${SES_S3_BUCKET}
結果
      An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist

このようにエラーとなれば削除完了しています。

続きを読む

[JAWS-UG CLI] ACM入門 #11 CloudFrontの削除

これはAWS Certificate Manager (ACM)入門ハンズオン資料の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。第1項へ進んでください

0. 準備

0.1. ドメイン名の変数への格納

変数へドメイン名を格納します。
ここでは example.tk とします。自分のドメイン名に読み替えてください。

コマンド
DOMAINNAME="example.tk" && echo ${DOMAINNAME}
結果(例)
      example.tk

0.2. ディストリビューションIDの変数への格納

コマンド
CF_DIST_ID=`aws cloudfront list-distributions 
 --query DistributionList.Items[].Id --output text` && echo ${CF_DIST_ID}
結果(例)
      EQSY786QZ6BPJ

1. CloudFrontの削除

1.1. ディストリビューション無効化のためのJSONファイルの作成

稼働しているディストリビューションを削除することはできません。
このため、まずは無効に設定する必要があります。
無効に設定変更するためのJSONファイルを作成します。

コマンド
cat << EOF > ./cfd.json
{
  "Comment": "",
  "CacheBehaviors": {
      "Quantity": 0
  },
  "Logging": {
      "Bucket": "",
      "Prefix": "",
      "Enabled": false,
      "IncludeCookies": false
  },
  "WebACLId": "",
  "Origins": {
      "Items": [
          {
              "OriginPath": "",
              "S3OriginConfig": {
                  "OriginAccessIdentity": ""
              },
              "Id": "www.${DOMAINNAME}",
              "DomainName": "www.${DOMAINNAME}.s3.amazonaws.com",
              "CustomHeaders": {
                "Quantity": 0
              }
          }
      ],
      "Quantity": 1
  },
  "DefaultRootObject": "",
  "PriceClass": "PriceClass_All",
  "Enabled": false,
  "DefaultCacheBehavior": {
      "TrustedSigners": {
          "Enabled": false,
          "Quantity": 0
      },
      "TargetOriginId": "www.${DOMAINNAME}",
      "ViewerProtocolPolicy": "allow-all",
      "ForwardedValues": {
          "Headers": {
              "Quantity": 0
          },
          "Cookies": {
              "Forward": "none"
          },
          "QueryStringCacheKeys": {
              "Quantity": 0
          },
          "QueryString": true
      },
      "MaxTTL": 31536000,
      "SmoothStreaming": false,
      "DefaultTTL": 86400,
      "AllowedMethods": {
          "Items": [
              "HEAD",
              "GET"
          ],
          "CachedMethods": {
              "Items": [
                  "HEAD",
                  "GET"
              ],
              "Quantity": 2
          },
          "Quantity": 2
      },
      "Compress": false,
      "MinTTL": 3600
  },
  "CallerReference": "www.${DOMAINNAME}",
  "ViewerCertificate": {
      "CloudFrontDefaultCertificate": true,
      "MinimumProtocolVersion": "SSLv3"
  },
  "CustomErrorResponses": {
      "Quantity": 0
  },
  "HttpVersion": "http2",
  "Restrictions": {
      "GeoRestriction": {
          "RestrictionType": "none",
          "Quantity": 0
      }
  },
  "Aliases": {
      "Quantity": 0
  }
}
EOF
cat ./cfd.json
結果(例)
      {
        "Comment": "",
        "CacheBehaviors": {
            "Quantity": 0
        },
        "Logging": {
            "Bucket": "",
            "Prefix": "",
            "Enabled": false,
            "IncludeCookies": false
        },
        "WebACLId": "",
        "Origins": {
            "Items": [
                {
                    "OriginPath": "",
                    "S3OriginConfig": {
                        "OriginAccessIdentity": ""
                    },
                    "Id": "www.example.tk",
                    "DomainName": "www.example.tk.s3.amazonaws.com",
                    "CustomHeaders": {
                      "Quantity": 0
                    }
                }
            ],
            "Quantity": 1
        },
        "DefaultRootObject": "",
        "PriceClass": "PriceClass_All",
        "Enabled": false,
        "DefaultCacheBehavior": {
            "TrustedSigners": {
                "Enabled": false,
                "Quantity": 0
            },
            "TargetOriginId": "www.example.tk",
            "ViewerProtocolPolicy": "allow-all",
            "ForwardedValues": {
                "Headers": {
                    "Quantity": 0
                },
                "Cookies": {
                    "Forward": "none"
                },
                "QueryStringCacheKeys": {
                    "Quantity": 0
                },
                "QueryString": true
            },
            "MaxTTL": 31536000,
            "SmoothStreaming": false,
            "DefaultTTL": 86400,
            "AllowedMethods": {
                "Items": [
                    "HEAD",
                    "GET"
                ],
                "CachedMethods": {
                    "Items": [
                        "HEAD",
                        "GET"
                    ],
                    "Quantity": 2
                },
                "Quantity": 2
            },
            "Compress": false,
            "MinTTL": 3600
        },
        "CallerReference": "www.example.tk",
        "ViewerCertificate": {
            "CloudFrontDefaultCertificate": true,
            "MinimumProtocolVersion": "SSLv3"
        },
        "CustomErrorResponses": {
            "Quantity": 0
        },
        "HttpVersion": "http2",
        "Restrictions": {
            "GeoRestriction": {
                "RestrictionType": "none",
                "Quantity": 0
            }
        },
        "Aliases": {
            "Quantity": 0
        }
      }

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

コマンド
jsonlint -q cfd.json
結果
      返り値なし

1.2. ETAGの取得

CloudFrontはETAGと呼ばれる現時点を示す一意性のIDが変更あるごとに変化します。
このため、変更を行う際は現在のETAGを都度取得する必要があります。

コマンド
ETAG=`aws cloudfront get-distribution 
 --id ${CF_DIST_ID} --query ETag --output text` && echo ${ETAG}
結果(例)
      E2RGD6G83K3B8Q

1.3. ディストリビューションの無効化

コマンド
aws cloudfront update-distribution --id ${CF_DIST_ID} 
 --if-match ${ETAG} --distribution-config file://cfd.json
結果(例)
      {
          "Distribution": {
              "Status": "InProgress",
              "DomainName": "d3plx1x2hvysv9.cloudfront.net",
              "InProgressInvalidationBatches": 0,
              "DistributionConfig": {
                  "Comment": "",
                  "CacheBehaviors": {
                      "Quantity": 0
                  },
                  "IsIPV6Enabled": true,
                  "Logging": {
                      "Bucket": "",
                      "Prefix": "",
                      "Enabled": false,
                      "IncludeCookies": false
                  },
                  "WebACLId": "",
                  "Origins": {
                      "Items": [
                          {
                              "S3OriginConfig": {
                                  "OriginAccessIdentity": ""
                              },
                              "OriginPath": "",
                              "CustomHeaders": {
                                  "Quantity": 0
                              },
                              "Id": "www.example.tk",
                              "DomainName": "www.example.tk.s3.amazonaws.com"
                          }
                      ],
                      "Quantity": 1
                  },
                  "DefaultRootObject": "",
                  "PriceClass": "PriceClass_All",
                  "Enabled": false,
                  "DefaultCacheBehavior": {
                      "TrustedSigners": {
                          "Enabled": false,
                          "Quantity": 0
                      },
                      "TargetOriginId": "www.example.tk",
                      "ViewerProtocolPolicy": "allow-all",
                      "ForwardedValues": {
                          "Headers": {
                              "Quantity": 0
                          },
                          "Cookies": {
                              "Forward": "none"
                          },
                          "QueryStringCacheKeys": {
                              "Quantity": 0
                          },
                          "QueryString": true
                      },
                      "MaxTTL": 31536000,
                      "SmoothStreaming": false,
                      "DefaultTTL": 86400,
                      "AllowedMethods": {
                          "Items": [
                              "HEAD",
                              "GET"
                          ],
                          "CachedMethods": {
                              "Items": [
                                  "HEAD",
                                  "GET"
                              ],
                              "Quantity": 2
                          },
                          "Quantity": 2
                      },
                      "MinTTL": 3600,
                      "Compress": false
                  },
                  "CallerReference": "www.example.tk",
                  "ViewerCertificate": {
                      "CloudFrontDefaultCertificate": true,
                      "MinimumProtocolVersion": "SSLv3",
                      "CertificateSource": "cloudfront"
                  },
                  "CustomErrorResponses": {
                      "Quantity": 0
                  },
                  "HttpVersion": "http2",
                  "Restrictions": {
                      "GeoRestriction": {
                          "RestrictionType": "none",
                          "Quantity": 0
                      }
                  },
                  "Aliases": {
                      "Quantity": 0
                  }
              },
              "ActiveTrustedSigners": {
                  "Enabled": false,
                  "Quantity": 0
              },
              "LastModifiedTime": "2016-11-05T06:40:52.996Z",
              "Id": "EXCSDJOUKJB7M",
              "ARN": "arn:aws:cloudfront::777777777777:distribution/EXCSDJOUKJB7M"
          },
          "ETag": "EYOPEK5P7XOW4"
      }

1.4. CloudFrontのデプロイ完了を待つ

コマンド
aws cloudfront wait distribution-deployed --id ${CF_DIST_ID}
結果
      返り値なし

プロンプトが帰ってくるまでこれは20~30分ぐらいかかります。
みんなでビールでも飲みながら亀田さんを囲んで待ちましょう。
(世界各地のエッヂロケーションへ設定を行うため時間がかかるのです)

waitコマンドには待てる限界が存在し、万一タイムアウトして
Waiter DistributionDeployed failed: Max attempts exceeded
という出力が返って来たらコマンドを再実行してください。

1.5. ETAGの取得

ETAGが変更されているので再度取得します。

コマンド
ETAG=`aws cloudfront get-distribution 
 --id ${CF_DIST_ID} --query ETag --output text` && echo ${ETAG}
結果(例)
      EYOPEK5P7XOW4

1.6. ディストリビューションの削除

ディストリビューション削除の準備が整いました。

コマンド
aws cloudfront delete-distribution --id ${CF_DIST_ID} --if-match ${ETAG}
結果
      返り値なし

1.7. 削除されたか確認

コマンド
aws cloudfront list-distributions
結果
      返り値なし

続きを読む