コンマ

メモ代わりにアウトプットしています。何か不備がありましたら、お気軽にコメント頂けると有り難いです。

【AWS】暗号化されていないRDSスナップショットを別AWSアカウントに共有する方法

 TL;DR

暗号化されていないRDS(MySQL)スナップショットを別AWSアカウントに共有する方法を記載しています。

関連情報

以下を参考にしました。

docs.aws.amazon.com

上記によると

手動 DB スナップショットを共有すると、暗号化されているかいないかに関係なく、権限のある AWS アカウントがスナップショットをコピーできるようになります。

また

暗号化されていない手動 DB スナップショットを共有すると、権限のある AWS アカウントが、DB インスタンスをコピーしてそこから復元するのではなく、スナップショットから DB インスタンスを直接復元できるようになります。ただし、共有され暗号化された DB スナップショットから、DB インスタンスを復元することはできません。代わりに、DB スナップショットのコピーを作成し、そのコピーから DB インスタンスを復元できます。

暗号化されたDBスナップショットと暗号化されていないDBスナップショットでは、方法が少し違うので、今回は暗号化されていないRDS(MySQL)のスナップショット共有方法を記載しています。

前提条件

暗号化されていないRDS(MySQL)を作成していること。

f:id:koooosuke:20190425144548p:plain

データがなかったので、適当にTable作成しました。

mysql>create table test_db.user (id int, name varchar(10));
mysql>insert into user (id, name) values (1, "ichiro"), (2, "jiro"), (3, "saburo");

やってみます

1. スナップショットをとる。

スナップショットの取得 f:id:koooosuke:20190425150515p:plain

スナップショット名を入力して、スナップショットの取得します。 f:id:koooosuke:20190425150811p:plain

スナップショット取得完了しました。 f:id:koooosuke:20190425151124p:plain

2.スナップショットを別アカウントに共有する。

スナップショットの共有 f:id:koooosuke:20190425151235p:plain

DB スナップショットの可視性をプライベートにしてAWS アカウントIDに共有したいIDを追加して、スナップショットを共有します。 f:id:koooosuke:20190425151608p:plain

3.共有されたスナップショットの確認

共有したいAWSアカウントでログインした上でスナップショット>共有ファイルにフィルタすると確認できました。 f:id:koooosuke:20190425152013p:plain

あとは、通常通りスナップショットの復元からDBインスタンスを立ち上げれば完了です。

【AWS】S3を別AWSアカウントに移管する方法

 TL;DR

S3を別AWSアカウントに移管する方法を記載しています。

関連情報

以下を参考にしました。

aws.amazon.com

dev.classmethod.jp

aws.amazon.com

上記によると

AWS アカウント間で Amazon S3 リソースを移管することはできません。その代わり、1 つのアカウントから別のアカウントに Amazon S3 オブジェクトをコピーし、コピーされたオブジェクトの所有権を移管先アカウントに付与することができます。

とのことなので、S3オブジェクトをコピーして、別アカウントに同期するイメージでできそうです。

やってみます。

1.まず、コピー先のAWSアカウントID番号を取得しておきます。

※マイアカウント>アカウントIDとかに書いてあるやつです。

2.コピー元アカウントから、コピー先アカウントがオブジェクトを取得できるように以下のポリシーをコピー元のバケットにアタッチします。

※<コピー先のAWSアカウントID番号>と<コピー元のS3のバケット名>の部分は修正しますmm

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {"AWS": "<コピー先のAWSアカウントID番号>"},
            "Action": ["s3:ListBucket","s3:GetObject"],
            "Resource": [
                "arn:aws:s3:::<コピー元のS3のバケット名>/*",
                "arn:aws:s3:::<コピー元のS3のバケット名>"
            ]
        }
    ]
}

こんな感じで変えてみます。 f:id:koooosuke:20190423215921p:plain

3.続いて、コピー先のバケットを作成しておきます。(destination-resource)

f:id:koooosuke:20190423220816p:plain

4.次にコピー先アカウントのユーザーを作成して、以下を参考にポリシーをアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<コピー元のS3のバケット名>",
                "arn:aws:s3:::<コピー元のS3のバケット名>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::<コピー先のS3のバケット名>",
                "arn:aws:s3:::<コピー先のS3のバケット名>/*"
            ]
        }
    ]
}

自分の場合、こんな感じになっています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::original-resource",
                "arn:aws:s3:::/original-resource/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::destination-resource",
                "arn:aws:s3:::destination-resource/*"
            ]
        }
    ]
}

で、なぜかアクセス拒否されてしまうので、一旦ポリシーをフルアクセスにに変更しました。(解決したら修正します。)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

5.以下のAWS CLIのコマンドを実行

$ aws s3 sync s3://original-resource s3://destination-resource
copy: s3://original-resource/terraform.json to s3://destination-resource/terraform.json
copy: s3://original-resource/test/iOS の画像.jpg to s3://destination-resource/test/iOS の画像.jpg

これでなんとかコピーされました!

【AWS】EC2を別アカウントに移管する方法

TL;DR

EC2インスタンスを別のAWSアカウントに移管する方法を記載しています。

関連情報

以下を参考にしました。

aws.amazon.com

前提条件

EC2インスタンスがすでに存在していることを前提に話を進めます。(Sample EC2)

f:id:koooosuke:20190422221940p:plain

手順

  1. Amazon Machine Image (AMI) を作成します。

f:id:koooosuke:20190422222636p:plain

 2. 上記で作成したAMIを指定して、アクション>イメージパーミッションの変更をクリックします。

f:id:koooosuke:20190422223609p:plain

  3. 移管先のAWSアカウント番号を入力し、アクセス許可をします。

f:id:koooosuke:20190422224039p:plain  4. 移管先のAWSアカウントでログイン後、EC2>インスタンスの作成>マイ AMI>「共有ファイル」のチェックボックスを選択すると、作成した別アカウントのAMIを選択できます。

f:id:koooosuke:20190422224548p:plain

これでいつもどおりインスタンスを作成していけば、EC2インスタンスの作成が可能となります。