![見出し画像](https://assets.st-note.com/production/uploads/images/152003290/rectangle_large_type_2_5fd4c3a49929c0f5a6a70bce02c80ca9.png?width=1200)
EC2のイメージをs3で持つメリット
みなさん、こんにちは!
突然ですが、みなさんはAWSでEC2やLightSailを使いますか??
私は、場合によっては使っていますが本当に限られています。
ただ、作ってもすぐにLambdaなどに移行してしまうのですが、
壊すの勿体無い精神が発動してしまうので、イメージだけ持っておこう。
とすると、、、
![](https://assets.st-note.com/img/1724631390880-TDhDW41m52.png)
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をコピーする。
![](https://assets.st-note.com/img/1724633055374-84iMbRjrTE.png?width=1200)
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です!
![](https://assets.st-note.com/img/1724634588862-ix4FDHkxhX.png?width=1200)
これで、あとは使いたい時まで眠らせましょう〜
使いたい時が来たら、、、
使いたい時がきた人、
もしくは中国リージョンや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です。
これでコストがさがっていたら、、、いいなぁ。
*あくまでも、私のやった事例であり参考情報くらいでとどめてください。
*意外と調べながらやると、私より良い事例もあるかと思いますので。。。