[EC2] カスタムAMIの活用:共有とコピー

2017.05.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

EC2の状態を簡単に保存・複製できるAmazon Machine Image(AMI)ですが、単なるイメージバックアップだけではなく、以下のような用途に利用することも可能です。

  • AMIの共有
  • AMIのコピー
    • 他リージョンへのコピー
    • スナップショットの暗号化

AMI共有

EC2から作成したAMIを一般公開したり、特定のAWSアカウントに共有することが可能です。

設定方法

マネジメントコンソールから

マネジメントコンソールから設定する場合には、対象のAMIを選択して[アクセス権限] -> [編集]を選びます。

using-ami-001

以下のような画面が表示されます。

using-ami-002

  • 一般公開する場合には[パブリック]、一部AWSアカウントにのみ共有する場合には[プライベート]を選択します。
  • プライベートの場合、対象のAWSアカウントを入力して[アクセス許可の追加]をクリック
  • [パーミッションを作成するときは次の関連付けられたスナップショットに "ボリューム作成" パーミッションを追加する]という項目ですが、AMIのみを共有する場合にはチェックの必要はありません。チェックを入れると、AMIに関連付けられたEBSのスナップショット単体にもアクセス権が設定されます。

以上で設定した範囲でAMIが公開/共有されます。

公開/共有を停止する場合には、同じ手順で[プライベート]にし、AWSアカウントを削除すればOKです。注意点として、AMI共有時に前述のスナップショット単体の共有も設定した場合、AMIの共有を停止してもスナップショットの共有は残ります。その場合にはスナップショットの画面から対象のアクセス権を削除してください。

AWS CLIから

AWS CLIから操作する場合は、modify-image-attributeコマンドを使います。一般公開の場合には、--launch-permission"Group":"all"を指定します。

$ aws ec2 modify-image-attribute \
  --image-id ami-xxxxxxx \
  --launch-permission "{\"Add\":[{\"Group\":\"all\"}]}"

一部AWSアカウントに共有する場合には、一般公開の場合には、--launch-permission"UserId"にアカウントIDを指定します。

$ aws ec2 modify-image-attribute \
  --image-id ami-xxxxxxx \
  --launch-permission "{\"Add\":[{\"UserId\":\"xxxxxxxxxxxx\"}]}"

AMI公開/共有の注意点

  • EBSに保存されたスナップショットがそのまま共有先に復元されますので、機密情報やIAMユーザのアクセスキー/シークレットキーなどが保存したまま共有されないよう、ご注意ください。
  • CloudWatchなど、他のAWSサービスと連携するアプリケーションやスクリプトを実装していた場合、共有先での権限など、動作に問題がないか注意しましょう。

AMIのコピー

AMIコピーでは、他のリージョンへのAMIのコピーと、暗号化したスナップショットをもつAMIへの変換が可能です。

設定方法

マネジメントコンソールから

対象のAMIを選択して [アクション] -> [AMIのコピー] を選択します。

using-ami-004

以下のような画面が表示されますので、[送信先リージョン] で任意のリージョンへAMIのコピーを作成可能です。

using-ami-005

[暗号化] にチェックを入れると、暗号化した状態でコピーが作成されます。暗号化に使用するKMSのキーを選択しましょう。

using-ami-006

[AMIコピー]を実行し、しばらく待てばAMIが作成されます。

AWS CLIから

AWS CLIからは、copy-imageコマンドを実行します。注意点は--regionで指定するのはコピー先で、コピー元は--source-regionで指定することです。

$ aws ec2 copy-image \
  --region us-east-1 \
  --source-region ap-northeast-1 \
  --source-image-id ami-xxxxxxx \
  --name xxxx

暗号化する場合には、--encryptedオプションを指定します。デフォルト以外のマスターキーを使い場合には--kms-key-idでマスターキーのARNを指定しましょう。

$ aws ec2 copy-image \
  --region us-east-1 \
  --source-region ap-northeast-1 \
  --source-image-id ami-xxxxxxx \
  --name xxxx \
  --encrypted \
  --kms-key-id "arn:aws:kms:us-east-1:xxxxxxxxxxxx:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

AMIコピーの注意点

  • 他リージョンへコピーした場合、AWSサービスとの連携で利用するリージョンに注意しましょう。コピー先のAMIから起動したEC2の、CloudWatchのカスタムメトリクスやログの送信先が、意図したリージョンになることを確認しましょう。
  • コピー時の暗号化で可能なのは以下のパターンです。暗号化済みのAMIを暗号化なしへコピーすることはできません。
    • 暗号化なし -> 暗号化なし
    • 暗号化なし -> 暗号化あり
    • 暗号化あり -> 暗号化あり

最後に

以上です。小ネタですが、AMIの活用方法について紹介しました。

参考資料