見出し画像

EC2のイメージをs3で持つメリット

みなさん、こんにちは!

突然ですが、みなさんはAWSでEC2やLightSailを使いますか??
私は、場合によっては使っていますが本当に限られています。

ただ、作ってもすぐにLambdaなどに移行してしまうのですが、
壊すの勿体無い精神が発動してしまうので、イメージだけ持っておこう。
とすると、、、

AMIにして3日目、EC2 - Otherのところに0.02USD、、、
あ、これ1ヶ月持ってたら0.3USDとか言っちゃうやつ、、、無駄だな。
ということで、今回はAMIではない方法でイメージを持つ方法をお伝えします。


そもそもなんで作ったの?

基本はLambdaなどのサーバレスで運用をしていこう!として色々作っているのですが、そうはいかない。というときもあるものです。

例えばですが、LambdaでBlueSkyへのBotを作成しようと思って作っていたのですが、どう頑張ってもatprotoのモジュールがLambdaに入らず。
サーバ上ならインストールするだけで動くし、とりあえず定額で使えるLightSailでやるか〜!という感じでした。

ただ、せっかく頑張って色々作ったところで、インプレッション数が増えていなかったこともあり、店仕舞いしようとしたところです。

AMIを作るメリットとデメリット

AMIを作るメリットとしては、同じ動作環境を構築してアプリケーションを実行できることですよね!

AMIでインスタンスを作成すると、まったく同じ動作環境の仮想サーバーを構築可能です。環境設定でミスをすることなく、一貫性を保ちながらアプリケーションを実行できるのは大きなメリットといえるでしょう。

ただ、いつか使うかもしれない。。。という考えで残し続けちゃうのが、人というものですよね。
AMIはEBSスナップショットとなるので、コストは以下の通りになっちゃいます。

スタンダード $0.05/GB/月
アーカイブ  $0.0125/GB/月

ちりつもで複数の構成をAMIにしておくと、コストが膨らむ要素が出てきますね。
一方でs3だと、、、

S3 standard storage $0.025/GB/月
S3 Glacier Instant Retrieval $0.005/GB/月

ということで、今回はAMIではなく、S3で保存するようにしましょう。

ただ、ぶっちゃけ、この方法でs3に置くのであれば、イメージをダウンロードしてGoogleドライブなど、無料で使える部分に置いておく方がさらにコストは下がりますが、、、管理めんどいですよねw

そもそもなんでAWSはこれをやれるの?

仕事柄使いながら、あーなるほど。確かに必要。と思ったのですが、
ある AWS パーティションから別の AWS パーティションに AMI をコピーする
ということをやりたい人は必ず通る道なのですね。。。

パーティションとは、IAMユーザガイドによるとARNの2番目に示されている要素で、AWSのリージョンのグループを示すものです。
今そこらへんにあるEC2やs3などを見てみましょう。arn:partition:service:region:account-id:resource-id

arnの次に書かれているのがaws-cnな人??
arnの次に書かれているのがaws-us-govな人??
ちょっといたら、、、握手させてください!(会ってみたい)

多分基本的には、arnの後ろはawsになっていると思います。

さて、AWSとAWS中国、AWS GovCloudはそれぞれ別のリソースとなっていて、これをパーティションと表現しているようです。
そしてこの「パーティション」が別であると、通常のAMIのリージョン間コピー(CopyImage)ができない。。。これ結構引っかかる要素。
パーティション間でのコピーを行うために準備されたのがこの機能だったのですね。

イメージをs3に書き出す方法

ここまで読んでいて、早くやり方教えてよ!というかた、、、
お待たせいたしました。
6ステップでできちゃいます!!!

1)AMIのイメージを作成する。
2)AMIのイメージに書かれているAMI IDをコピーする。
3)AWS CLIを使って、SSOログインする。
4)AWS CLIを使って、AMIのイメージをs3に作成する。
5)AMIのイメージが作成されたか確認する。
6)イメージがs3に書き込まれたことを確認する。

1)AMIのイメージ作成

あんだけ、AMI使わないで〜!と言いつつ、まず最初にやることはAMIのイメージ作成です。ここはコンソール上でやってしまいましょう。
やり方はいつも通りです。
AMIのイメージが作成できたら、コンソールでAMIのページに移動します。

2)AMIのイメージに書かれているAMI IDをコピーする。

AMIが作成されて、ステータスが利用可能になっていたら、、、
この赤枠部のAMI IDをコピーしておきます。
チェックマークを入れると、下に詳細が出てくるので、そこからコピー取る方が楽かもしれません。

3)AWS CLIを使って、SSOログインする。

ここからはターミナルなどコマンドをつかっていきます。
AWS CLIコマンドをローカル上でやったことない人は、コンソール上にあるCloudShellでも大丈夫で、一旦ここはスキップで大丈夫です。

4)AWS CLIを使って、AMIのイメージをs3に作成する。

さて、ここからが本題です。
以下のコマンドを入力します。

aws --profile <SSO Name> --region <Region> ec2 create-store-image-task --bucket <Bucket Name> --image-id <AMI ID>

CloudShellからやる人は、先頭の--profile部分はいらないと思います。
リージョンは今利用しているリージョンを、bucket名は書き出したいバケット名を入力しましょう。

たったこれだけです。
例えばこんな感じになります。

aws --profile moris --region ap-northeast-1 ec2 create-store-image-task --bucket xxxxxxx --image-id ami-xxxxxxxx

5)AMIのイメージが作成されたか確認する。

イメージを作成し始めたところで、進捗気になりますよね。
700MBくらいなら秒で終わりますし、8GBくらいだと10〜20分かかったりします。
進捗状況を確認するには、以下のコマンドを入力します。

aws --profile <SSO Name> --region <Region> ec2 describe-store-image-tasks --max-items 1

すると、以下のようなアウトプットが返ってきます。

{
    "StoreImageTaskResults": [
        {
            "AmiId": "ami-xxxxxxxx",
            "TaskStartTime": "2024-08-25T23:38:29.985000+00:00",
            "Bucket": "xxxxxxxx",
            "S3objectKey": "ami-xxxxxxxx.bin",
            "ProgressPercentage": 100,
            "StoreTaskState": "Completed",
            "StoreTaskFailureReason": ""
        }
    ]
}

ProgressPercentageが進捗率で、StoreTaskStateがステータスですね。
今回は700MBと比較的小さいイメージだったのでほんと1秒くらいで終わりました。

6)イメージがs3に書き込まれたことを確認する。

終わっているようであれば、あとはs3に書き出されていればOKです!

これで、あとは使いたい時まで眠らせましょう〜

使いたい時が来たら、、、

使いたい時がきた人、
もしくは中国リージョンやAWS GovCloudを使い始めた人。

s3に封印しているAMIを解いてあげましょう。

こっちはなんと、、、1ステップで復活できます!

0)イメージを必要なAWSアカウントに移動させる。
1)移動させたイメージを使って、AMIに登録させる。

0)イメージを必要なAWSアカウントに移動させる。

もし別のアカウントで動かしたいとか、中国やGovCloudに移行したいなどあれば、移行しましょう。

1)イメージを使って、AMIに登録させる。

たったこれだけです。SSOログインはしてくださいね。

aws --profile <profile> --region <region> ec2 create-restore-image-task --bucket <bucket> --object-key <object-key> --name “<name>”

“<name>”は好きな名前にしてください。
AMI Nameのところがこのnameになります。

あとはEC2のコンソール上にあるAMIのところに登録されていたらOKです。

これでコストがさがっていたら、、、いいなぁ。

*あくまでも、私のやった事例であり参考情報くらいでとどめてください。
*意外と調べながらやると、私より良い事例もあるかと思いますので。。。

いいなと思ったら応援しよう!