S3のアクセスコントロールが多すぎて訳が解らないので整理してみる


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

Amazon S3のアクセスコントロールがわけわからない

いくつもあってわけがわかりませんね。
それぞれ何が出来て何ができないのか、どうゆう時にどれを使うのか、組み合わせて使うとどうなるのか、いい機会なので整理してみたいと思います。

ACL

これはおそらくいちばん古くからある機能です。
permissions
ManagementConsoleではPermissionsというところで設定ができます。
ACLの設定はバケット、もしくはオブジェクト単位で設定する事が出来るのが特徴になっています。
APIを見てみても、putBucketACLとputObjectACLとあることから、Bucket単位でのACLとObject単位でのACLがあることが分かります。 別のアカウントにまたがって設定することも出来ます。

BucketPolicy

S3のBucketに対して、PolicyDocumentを使ってアクセスコントロールを設定出来ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "Id": "bucketpolicy-${oacl}-${acl}-${EFFECT}",
  "Statement": [
    {
      "Sid": "Stmt${UNIQ}-1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "${EFFECT}",
      "Resource": "arn:aws:s3:::${BUCKET}/*",
      "Principal": {
        "AWS": [
          "${TARGET_PRINCIPAL}"
        ]
      }
    },
    {
      "Sid": "Stmt${UNIQ}-2",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "${EFFECT}",
      "Resource": "arn:aws:s3:::${BUCKET}",
      "Principal": {
        "AWS": [
          "${TARGET_PRINCIPAL}"
        ]
      }
    }
  ]
}

こんな感じで、Action, Effect, Principal, Resourceと、これらを組み合わせて柔軟なアクセスコントロールが実現出来ます。
この一個のファイルだけを公開したいとかそういった用途に使うのには向いていないように思います。ObjectACLを使いましょう。
個人的な感覚ですが、bucketACLはBucketPolicyに置き換えたほうが良いなと思っています。

ACLとBucketPolicyどちらが強いのか

気になってしまったので、ACLとBucketPolicyどちらが強いのかを検証したいと思います。
検証の方法は簡単です。 ACLは許可するか、何もしないかの2値です。BucketPolicyは許可する、拒絶する、何もしないの3値です。
ACLはBucketとObjectがありますので、この3つの設定を全通りの組み合わせでやってみます。

BucketACLObjcetACLBucketPolicy結果
許可許可拒否失敗
許可未設定拒否失敗
許可許可許可成功
許可未設定許可成功
許可許可未設定成功
許可未設定未設定失敗
未設定許可拒否失敗
未設定未設定拒否失敗
未設定許可許可成功
未設定未設定許可成功
未設定許可未設定成功
未設定未設定未設定失敗

この結果からもわかるように、[Bucket|Object]ACLよりもBucketPolicyの方が強くなります。 BucketPolicyで設定されていない場合は、ObjcetACL , BucketACLによって制御されています。 
これについては、公式にドキュメントでここここにも書いて有ります。
さらにBucketPolicyではIPアドレスで制御やRefererで制御も出来ます。
直リン禁止とか出来たりします。

IAM(IAMRole)

IAMではPolicyDocumentを使用してアクセスをコントロールします。
IAMとBucketPolicyの違いはユーザ(クライアント)側に紐付いて権限が与えられるということです。
また、現在はPolicyに変数を利用する事が出来るため、ユーザ名に応じたアクセスのコントロールが可能になっています。
例えば、こんな感じです。
policyDocumentに

1
2
3
4
5
6
7
8
9
10
11
12
13
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": ["arn:aws:s3:::BUCKET/${aws:username}/*"]
        }
    ]
}

と記述されていたら、
IAMuser名: akeri の時には s3://BUCKET/akeri/ で始まるオブジェクトにアクセス出来る事になります。
BucketPolicy同様にconditionによって、条件を指定する事も出来ます。
IPアドレスで制御したり、 @see AWS Identity and Access Management

で、IAMとBucketPolicyはどっちが強いの?

先ほどACLとBucketPolicyを試してみたら、BucketPolicyが強かったのですが、今度はIAMとBucketPolicyどっちが強いのかを試してみたいと思います。
さっきと同様に総当りで調べてみます。 今回ACLは何も設定していない状態です。

BucketPolicyIAM結果
拒否拒否失敗
拒否許可失敗
許可拒否失敗
許可許可成功
未設定拒否失敗
未設定許可成功

結果はこんな感じです。
とりあえず、IAMで許可されていないと確実に失敗します。
当たり前といえば当たり前な気がします。
しかし、IAMで許可されていたとしてもBucketPolicyで拒否されているとアクセス出来ませんでした。 とりあえず、ここから わかることは拒否は絶対ということです。
IAMで拒否されていてもBucketPolicyで拒否されていても、失敗します。
成功するのは、IAMで許可されているかつBucketPolicyで拒否されていない(Allowもしくは未設定)の場合でした。
さっきのACLとBucketPolicyではわかりませんでしたが、BucketPolicyが優先されているわけではなくて、Denyが優先されているようです。

まとめ

上記の結果から、S3のACLに関するルールがなんとなく見えてきました。
ACLの基本として、どこかしらでDenyとなっていたら、ほかでAllowだろうとDenyになってしまいます。
Denyに対して、Allowで上書きは出来ません。
それとは逆にBucketPolicyやACLでAllowを設定していても、IAMでDenyであった場合は当然アクセス出来ません。
ここから考えるベストプラクティスというのはパットは出てきませんが、ACLはあるオブジェクト一つだけを公開したい時や、publicにする時に使う以外では使わないのかもしれません。
まとめるとタイトルで言ったものの、あまりまとめられてる感じがしないですね。ごめんなさい。

バケットとして不変的なアクセスコントロールはBucketPolicyで定義し、IAMはユーザ毎に変更になるようなものを設定するのが良いのではと思います。この時にBucketPolicyでDenyを付けてしまうと、IAMでいくら設定してもDenyなので、今の段階で私の考えられるベターな方法は、まずは必要なところだけBucketPolicyで公開します。その公開している範囲ないで更に限定的に拒否したいところにはDenyで上書いてあげる方法が良さそうです。
さらにIAMでは変数が使えるので、グループのPolicyで一括設定もできるので、複数のユーザがいて、あるルールに基づいてアクセスをコントロールしたい場合にはIAMを使いたいですね。

用途をまとめるとこんな感じかなと思います。◯はいいじゃんで、☓は出来ない。△はやってやれないことは無いけど、めんどくさすぎてやりたくない位なゆるい判断基準で付けてます。

ユースケース[Bucket|Object]ACLBucketPolicyIAM
一個のObjectを公開したい
バケット全体を公開したい
特定のユーザにだけ公開したい
IPアドレス制限をかけたい
Bucketの中のPrefixを指定して公開したい
prefixがユーザ毎に可変








Amazon EC2 루트 디바이스 볼륨

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/RootDeviceStorage.html


인스턴스를 시작하면 인스턴스 부팅에 사용된 이미지가 루트 디바이스 볼륨에 저장됩니다. Amazon EC2가 출시되었던 시점에서는 Amazon EC2 인스턴스 스토어가 모든 AMI를 지원했으므로 AMI에서 시작한 인스턴스의 루트 디바이스는 Amazon S3에 저장된 템플릿으로부터 생성된 인스턴스 스토어 볼륨이었습니다. Amazon EBS가 출시된 후에는 Amazon EBS의 지원을 받는 AMI가 도입되었습니다. 따라서 AMI에서 시작한 인스턴스의 루트 디바이스는 Amazon EBS 스냅샷으로부터 생성된 Amazon EBS 볼륨입니다.

사용자는 Amazon EC2 인스턴스 스토어가 지원하는 AMI와 Amazon EBS에서 지원하는 AMI 중에서 선택할 수 있습니다. 시작 속도가 더 빠르고 영구 스토리지를 사용하는 Amazon EBS 지원 AMI를 사용하는 것이 좋습니다.

루트 볼륨에 대해 Amazon EC2에서 사용하는 디바이스 이름에 대한 자세한 정보는 Linux 인스턴스의 디바이스 명명 단원을 참조하십시오.

루트 디바이스 스토리지 개념

인스턴스 스토어 지원 AMI 또는 Amazon EBS 지원하는 AMI에서 인스턴스를 시작할 수 있습니다. AMI 설명에는 AMI의 유형이 포함되며, 설명 중간에 루트 디바이스가 ebs(Amazon EBS 지원) 또는 instance store(인스턴스 스토어 지원)로 언급됩니다. 각 AMI 유형별로 수행할 수 있는 작업이나 기능이 달라지기 때문에 이 차이점을 아는 것이 중요합니다. 해당 차이점에 대한 자세한 정보는 루트 디바이스 스토리지 단원을 참조하십시오.

인스턴스 스토어 지원 인스턴스

인스턴스 스토어를 루트 디바이스로 사용하는 인스턴스는 하나 이상의 인스턴스 스토어 볼륨을 자동으로 사용할 수 있으며, 이러한 볼륨 중 하나가 루트 디바이스 볼륨 역할을 합니다. 인스턴스가 시작되면 인스턴스를 부팅하는 데 사용된 이미지가 루트 볼륨으로 복사됩니다. 인스턴스 유형에 따라 다른 인스턴스 스토어 볼륨을 사용할 수도 있습니다.

인스턴스 스토어 볼륨의 모든 데이터는 인스턴스가 실행되는 동안 유지되지만, 인스턴스가 종료되거나(인스턴스 스토어 지원 인스턴스는 중지 작업을 지원하지 않음) 장애가 발생하면(예: 기본 드라이브에 문제가 있는 경우) 데이터가 삭제됩니다.


     Amazon EC2 인스턴스 스토어가 지원하는 인스턴스의 루트 디바이스

인스턴스 스토어가 지원하는 인스턴스는 종료되거나 장애가 발생할 경우 복원이 불가능합니다. Amazon EC2 인스턴스 스토어가 지원하는 인스턴스를 사용하려는 경우 여러 가용 영역의 인스턴스 스토어로 데이터를 분산하는 것이 좋습니다. 또한 인스턴스 스토어 볼륨의 중요한 데이터를 정기적으로 영구 스토리지로 백업해야 합니다.

자세한 정보는 Amazon EC2 인스턴스 스토어 단원을 참조하십시오.

Amazon EBS 지원 인스턴스

Amazon EBS를 루트 디바이스로 사용하는 인스턴스에는 자동으로 Amazon EBS 볼륨이 연결됩니다. Amazon EBS 지원 인스턴스를 시작하면 사용하는 AMI가 참조하는 각 Amazon EBS 스냅샷에 대한 Amazon EBS 볼륨이 생성됩니다. 인스턴스 유형에 따라 다른 Amazon EBS 볼륨이나 인스턴스 스토어 볼륨을 사용할 수도 있습니다.


     Amazon EBS 지원 인스턴스의 루트 디바이스 볼륨 및 기타 Amazon EBS 볼륨

Amazon EBS 지원 인스턴스는 중지한 후 다시 시작해도 연결된 볼륨에 저장된 데이터에 아무런 영향이 없습니다. Amazon EBS 지원 인스턴스가 중지 상태일 때 다양한 인스턴스 및 볼륨 관련 작업을 수행할 수 있습니다. 예를 들어 인스턴스의 속성을 수정하거나, 인스턴스의 크기를 변경하거나, 사용하는 커널을 업데이트하거나, 디버깅 등의 목적으로 루트 볼륨을 실행 중인 다른 인스턴스에 연결할 수 있습니다.

Amazon EBS 지원 인스턴스에서 장애가 발생할 경우 다음 방법 중 하나로 세션을 복원할 수 있습니다.

  • 중지 후 다시 시작합니다(먼저 이 방법 시도).

  • 모든 관련 볼륨의 스냅샷을 자동으로 생성하고 새 AMI를 생성합니다. 자세한 정보는 Amazon EBS 지원 Linux AMI 생성 단원을 참조하십시오.

  • 다음 단계에 따라 볼륨에 새 인스턴스를 연결합니다.

    1. 루트 볼륨의 스냅샷을 생성합니다.

    2. 스냅샷을 사용하여 새 AMI를 등록합니다.

    3. 새 AMI에서 새 인스턴스를 시작합니다.

    4. 나머지 Amazon EBS 볼륨을 이전 인스턴스에서 분리합니다.

    5. Amazon EBS 볼륨을 새 인스턴스에 다시 연결합니다.

자세한 정보는 Amazon EBS 볼륨 단원을 참조하십시오.

루트 디바이스 유형에 따른 AMI 선택

인스턴스를 시작할 때 지정하는 AMI가 인스턴스의 루트 디바이스 볼륨 유형을 결정합니다.

콘솔을 사용하여 Amazon EBS 지원 AMI를 선택하려면 다음을 수행합니다.

  1. Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 AMI를 선택합니다.

  3. 필터 목록에서 퍼블릭 이미지 등의 이미지 유형을 선택합니다. 검색 창에서 플랫폼을 선택하고 Amazon Linux 등의 운영 체제를 선택한 후 루트 디바이스 유형을 선택하고 EBS 이미지를 선택합니다.

  4. (선택 사항) 결정에 도움이 되는 추가 정보를 얻으려면 열 표시/숨기기 아이콘을 선택하고 표시할 열을 업데이트한 후 닫기를 선택합니다.

  5. AMI를 선택하고 AMI ID를 메모해 둡니다.

콘솔을 사용하여 인스턴스 스토어 지원 AMI를 선택하려면 다음을 수행합니다.

  1. Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 AMI를 선택합니다.

  3. 필터 목록에서 퍼블릭 이미지 등의 이미지 유형을 선택합니다. 검색 창에서 플랫폼을 선택하고 Amazon Linux 등의 운영 체제를 선택한 후 루트 디바이스 유형을 선택하고 인스턴스 스토어를 선택합니다.

  4. (선택 사항) 결정에 도움이 되는 추가 정보를 얻으려면 열 표시/숨기기 아이콘을 선택하고 표시할 열을 업데이트한 후 닫기를 선택합니다.

  5. AMI를 선택하고 AMI ID를 메모해 둡니다.

명령줄을 사용하여 AMI의 루트 디바이스 볼륨 유형을 확인하려면 다음을 수행합니다.

다음 명령 중 하나를 사용할 수 있습니다. 명령줄 인터페이스에 대한 자세한 정보는 Amazon EC2에 액세스 단원을 참조하십시오.

인스턴스의 루트 디바이스 유형 확인

콘솔을 사용해 인스턴스의 루트 디바이스 유형을 확인하는 방법

  1. Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 인스턴스를 선택하고 인스턴스를 선택합니다.

  3. 아래를 참고하여 설명 탭의 루트 디바이스 유형 값을 확인합니다.

    • 값이 ebs이면 Amazon EBS 지원 인스턴스입니다.

    • 값이 instance store이면 인스턴스 스토어 지원 인스턴스입니다.

명령줄을 사용해 인스턴스의 루트 디바이스 유형을 확인하는 방법

다음 명령 중 하나를 사용할 수 있습니다. 명령줄 인터페이스에 대한 자세한 정보는 Amazon EC2에 액세스 단원을 참조하십시오.

루트 디바이스 볼륨 지속 설정

기본적으로 Amazon EBS에서 지원하는 AMI의 루트 디바이스 볼륨은 인스턴스 종료 시 삭제됩니다. 기본 동작을 변경하려면 블록 디바이스 매핑을 사용하여 DeleteOnTermination속성을 false로 설정합니다.

콘솔을 사용하여 루트 볼륨이 계속 유지되도록 변경

콘솔을 사용하면 인스턴스를 시작할 때 DeleteOnTermination 속성을 변경할 수 있습니다. 실행 중인 인스턴스의 속성을 변경하려면 명령줄을 사용해야 합니다.

콘솔을 사용해 인스턴스의 루트 디바이스 볼륨 유지를 설정하는 방법(인스턴스 시작 시)

  1. Amazon EC2 콘솔을 엽니다.

  2. Amazon EC2 콘솔 대시보드에서 인스턴스 시작을 선택합니다.

  3. Amazon 머신 이미지(AMI) 선택 페이지에서 사용할 AMI를 선택하고 선택을 선택합니다.

  4. 마법사 안내에 따라 인스턴스 유형 선택 및 인스턴스 세부 정보 구성 설정을 완료합니다.

  5. 스토리지 추가 페이지에서 루트 볼륨에 대한 종료 시 삭제의 선택을 해제합니다.

  6. 나머지 마법사 페이지를 완료한 후 시작을 선택합니다.

인스턴스의 세부 정보 창에서 루트 디바이스 볼륨의 세부 정보를 조회하여 설정을 확인할 수 있습니다. 블록 디바이스 옆의 루트 디바이스 볼륨 항목을 선택합니다. 종료 시 삭제의 기본 설정은 True입니다. 기본 설정을 변경하면 종료 시 삭제의 설정 값이 False가 됩니다.

AWS CLI를 사용하여 인스턴스의 루트 볼륨이 계속 유지되도록 변경

AWS CLI를 사용하여 인스턴스 시작 시 또는 인스턴스 실행 중에 DeleteOnTermination 속성을 변경할 수 있습니다.

예 시작 시

루트 볼륨을 보존하려면 run-instances 명령을 사용하여 DeleteOnTermination 속성을 false로 설정하는 블록 디바이스 매핑을 포함시킵니다.

aws ec2 run-instances --block-device-mappings file://mapping.json other parameters...

mapping.json에서 다음을 지정합니다.

[ { "DeviceName": "/dev/sda1", "Ebs": { "DeleteOnTermination": false } } ]

아래와 같이 describe-instances 명령을 사용하고 명령 출력에서 디바이스의 BlockDeviceMappings 항목을 찾아보면 DeleteOnTermination이 false인 것을 확인할 수 있습니다.

... "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "Status": "attached", "DeleteOnTermination": false, "VolumeId": "vol-1234567890abcdef0", "AttachTime": "2013-07-19T02:42:39.000Z" } } ...

예 인스턴스 실행 중

루트 볼륨을 보존하려면 modify-instance-attribute 명령을 사용하여 DeleteOnTermination 속성을 false로 설정하는 블록 디바이스 매핑을 포함시킵니다.

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --block-device-mappings file://mapping.json

mapping.json에서 다음을 지정합니다.

[ { "DeviceName": "/dev/sda1", "Ebs" : { "DeleteOnTermination": false } } ]






【新機能】Amazon SQSにFIFOが追加されました!(重複削除/単一実行/順序取得に対応)





https://dev.classmethod.jp/cloud/sqs-new-fifo/

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

SQSの大型アップデートです!

オンプレでエンタープライズな開発を行ったことがある方であれば、分散キューシステムの設計が大変だったと思います。実際のところは高額ライセンス商品を買うしか選択肢はなかったのではと。Amazon SQSの登場によって、今まで実装が大変だったノンコア機能のキューが、超安価に簡単に使えるようになったのは衝撃でした。これだけでクラウドを使う理由になりました。

そして、年月は流れ、この度SQSが進化しました!まずは、今までのSQSの課題についておさらいしたいと思います。

標準キュー

今までのSQSは、メディアエンコーディングや大量タスクの分散処理などに適していましたが、いくつかの用途においてフィットしなかったり、独自実装をする必要がありました。

順番が保証されない

SQSは高可用性を持った分散キューシステムですので、1つのエンドポイントに投げられたメッセージは複製され蓄積されます。そのため、メッセージを取り出した際に、一番古いキューデータを取るとは限りませんでした。メディアエンコーディングであれば実行順番は関係ありませんが、商品をカートに入れて購入して配送といった順番を持つことが必須のワークフローではキューの活用は難しかったです。

SS 2016-11-19 15.19.49

※できるだけFIFOになるように努力をしていますが保証していません。

メッセージが重複する可能性がある

SQSは高可用性を持った分散キューシステムですので、メッセージを取得するプログラムが複数同時に実行されると、タイミングの問題で、同じメッセージを取得してしまう可能性があります。もちろん、そうならないようにメッセージを取得すると取得マークが付いて、処理が終わったら削除、失敗したら戻すといった機能は以前から入っていますが、重複しないことを保証して居ませんでした。ですから、メディアエンコーディングであれば、2回実行しても結果は変わらないですが、商品購入プロセスを考えた場合、1回の購入処理を2回実行してしまう可能性があっては困るわけです。

SS 2016-11-19 15.21.50

呼び出し側が2回呼んだら2回実行

これはSQSの問題では無いのですが、例えばモバイルアプリなど通信が安定しない環境で何かしらSQSにメッセージを入れようとした場合、たまたま通信が切ればアプリ側で再実行してしまうことがあります。そうすると、2回実行されてしまうことがあります。これはソシャゲの設計などで良く考慮されていることで、Re-runnable設計といって、2回トランザクションが呼ばれても状態として異常にならないようにする設計方法です。

SS 2016-11-19 15.22.39

標準キューは、"必ず最低1回は実行されることを保証し、高速にタスクを実行したい時に使うサービス"と憶えておいてください。

FIFOキュー

今回の大型アップデートによってFIFOがサポートされました。つまり、メッセージを入れた順番で処理することが保証されます。

順番が保証されます

もう狂喜乱舞です。1,2,3の順番でメッセージを入れたら、必ず1,2,3の順番が保証されます。

SS 2016-11-19 15.27.45

複数回実行されません

もう狂喜乱舞です。例えば、商品の購入という手続きを2回実行しないことを保証します。

SS 2016-11-19 15.33.24

間違って同じ呼び出しをしたら削除します

もう狂喜乱舞です。呼び出す側が意図せずに2回呼んでしまうことって結構あるんですよね。これを排除するためにRe-runnable設計が必要でしたが、全てのシステムにおいてこれを考慮することは大変です。メッセージの重複をチェックする期間はデフォルトで5分ですので、あくまでも意図せず連続して2回送ってしまった場合の削除と考えておいてください。

SS 2016-11-19 15.36.23

FIFOキュー使ってみる

それでは、FIFOキューを使ってみましょう。とりあえずオレゴンあたりを選んでSQSを作成します。

SS 2016-11-19 16.04.31

FIFOキューの名前は接尾語として.fifoを書く必要があります(.lifoの登場の予感w)。

ここで注目するのは、"メッセージグループID"と、"メッセージ重複削除ID"です。メッセージグループID毎にFIFOでメッセージを受け取ります。メッセージ重複削除IDは、指定したIDが短時間(デフォルト5分)内に再送された場合には、後から来たメッセージを重複として削除する機能です。このIDを自分で管理して付与することもできます。自分で管理するのであればUUID等を付与すれば良いですし、コンテンツがユニークであることが約束されているのであればSHA1でも良いかもしれません。なお、キュー作成において、コンテンツベースの重複削除(ContentBasedDeduplication)をTrueにすることで、メッセージ重複削除IDの自前作成は不要になります。勝手にSHA256でハッシュ化して付与してくれます。

SS 2016-11-19 16.03.16

メッセージを取り出す時の工夫もあります。ワーカーが受信要求試行ID(Receive Request Attempt ID)を指定して受信することで、同じメッセージを受信することができます。ネットワークの問題などが発生した際に、もう1回取れるようにするためにIDを指定します。これは実際のところはUUIDで良いかと思います。受信に失敗したら同じUUIDで取得します。

コマンドラインでFIFOキュー使ってみる

概念が分かりましたので実際にCLIを使ってやってみましょう。FIFOキューを作成する際に属性を指定しますので、属性情報を書いたファイルを用意します。

キューの作成

1
2
3
4
5
$ cat create-queue.json
{
  "FifoQueue": "true",
  "ContentBasedDeduplication": "true"
}

次に、FIFOキューを作成して、URLを変数に入れておきます。

1
2
3
4
5
$ REGION=us-west-2
$ QURL=$(aws sqs create-queue --region $REGION --queue-name myq.fifo
  --attributes file://create-queue.json | jq -r .QueueUrl)
$ echo $QURL

新規作成したキューの設定情報です

SS 2016-11-20 20.15.13

可視性タイムアウトが30秒であることを押さえておいてください。

メッセージの追加

FIFOキューを作成できました。次に、1件メッセージを送ります。

1
2
3
4
5
6
7
$ aws sqs send-message --queue-url  $QURL --region $REGION
  --message-body helloworld --message-group-id group1
{
    "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017cZZZ",
    "SequenceNumber": "18825507834392815111",
    "MessageId": "8f190a7c-d85f-4246-bb19-42cc2fdc8zzz"
}

ここで全く同じBODY内容で時間を置かずに送ってみます。

1
2
3
4
5
6
7
$ aws sqs send-message --queue-url  $QURL --region $REGION
  --message-body helloworld --message-group-id group1
{
    "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017czzz",
    "SequenceNumber": "18825508188058863111",
    "MessageId": "b78be0b9-d026-44de-bd28-31d918b96bbb"
}

そしてキュー内メッセージの数をカウントしてみます。

1
2
3
4
5
6
7
$ aws sqs get-queue-attributes --queue-url $QURL --region $REGION
  --attribute-names ApproximateNumberOfMessages
{
    "Attributes": {
        "ApproximateNumberOfMessages": "1"
    }
}

メッセージを2件入れたのですが、message-deduplication-idが同じだったので後から入ったものが削除されています。なお、同じmessage-deduplication-idだったとしても、5分経過していれば別物として扱いますので注意してください。

続いて、同じmessage-group-idで、異なるメッセージBODYを入れます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ aws sqs send-message --queue-url  $QURL --region $REGION
  --message-body helloworld2 --message-group-id group1
{
    "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592",
    "SequenceNumber": "18825508280833007616",
    "MessageId": "0df51fae-17c7-44b9-b60f-f667416241d7"
}
$ aws sqs send-message --queue-url  $QURL --region $REGION
  --message-body helloworld3 --message-group-id group1
{
    "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592",
    "SequenceNumber": "18825508282470639616",
    "MessageId": "2ec94b13-3aeb-48b3-beca-5aa87b3b1247"
}
$ aws sqs get-queue-attributes --queue-url $QURL --region $REGION
  --attribute-names ApproximateNumberOfMessages
{
    "Attributes": {
        "ApproximateNumberOfMessages": "3"
    }
}

次に、異なるmessage-group-idで、異なるBODYを入れます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ aws sqs send-message --queue-url  $QURL --region $REGION
  --message-body morining --message-group-id group2
{
    "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592",
    "SequenceNumber": "18825508313601775616",
    "MessageId": "020a5d1b-66a7-4735-b14a-10d6e9bdc667"
}
$ aws sqs send-message --queue-url  $QURL --region $REGION
  --message-body morining2 --message-group-id group2
{
    "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592",
    "SequenceNumber": "18825508315499503616",
    "MessageId": "da1cecb5-12ab-4603-880c-df10162c5b66"
}
$ aws sqs send-message --queue-url  $QURL --region $REGION
  --message-body morining3 --message-group-id group2
{
    "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592",
    "SequenceNumber": "18825508317191407616",
    "MessageId": "b2e7a84c-f666-49c1-b54a-baf285d58f1c"
}
$ aws sqs get-queue-attributes --queue-url $QURL --region $REGION
  --attribute-names ApproximateNumberOfMessages
{
    "Attributes": {
        "ApproximateNumberOfMessages": "6"
    }
}

これで、2つのグループに3件ずつのメッセージが入りました。

メッセージの取得

次にワーカーとしてメッセージを取得してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ UUID=$(uuidgen)
$ echo $UUID
1CFC2457-0767-4D4C-9819-C4C22E24071E
 
$ aws sqs receive-message --queue-url $QURL --region $REGION
  --attribute-names All --receive-request-attempt-id $UUID
{
    "Messages": [
        {
            "Body": "morining",
            "Attributes": {
                "ApproximateFirstReceiveTimestamp": "1119638944600",
                "SequenceNumber": "15511131597872111616",
                "SenderId": "ZZZAJXUQ7RG7FZPNOUMRM",
                "MessageDeduplicationId": "56367252a69f6afa4877157f27c3e464e0d13deee67578b154042986cf1f6c15",
                "SentTimestamp": "1479638766260",
                "ApproximateReceiveCount": "2",
                "MessageGroupId": "group2"
            },
            "ReceiptHandle": "AQEBNw8oUaQB0ANhOjNAqWyHS2ZMZUu0rkYrYJMeSl111kCo0v7JPILPLJXA04mWxAXpb9MGnh31pFxzsbOCadtN/sIZYV8thAzZKa5OkF59I5BNMZ+Kqg8HUGorSTGOG9QIan9OcpEemzrcbheGUFk23kkUyzYKLrACCjqcwZaw4yeoPlxyJOglnB3Vya2fJT61uIAdPH2OfV9o85z5txsOCBjFi91nPE1Lu9gzZTYxzPmkzEOp2MGext7plF23p1hKZiFRSaaLi/IvqBRtzMeXGg==",
            "MD5OfBody": "380ef125db2b45da5c643d59165b8706",
            "MessageId": "8a22f17d-6a4e-4887-85a5-84976393cef0"
        }
    ]
}

受信要求試行ID(Receive Request Attempt ID)を指定していますので、間を置かずに連続して何度やっても同じメッセージが取得できます。ただし少し待ってから実行するとエラーになります。以下は、エラーになったときの表示です。おそらく可視性タイムアウトを過ぎたため、他ワーカーも取れる状況になってしまったためのエラーかと思います。あくまでもネットワークエラーなども例外時に用いましょう。

1
An error occurred (InvalidParameterValue) when calling the ReceiveMessage operation: Value YYYYYYYY for parameter receiveRequestDeduplicationId is invalid. Reason: receiveRequestDeduplicationId is invalid.

受信要求試行ID(Receive Request Attempt ID)を別にしてメッセージを取得してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ UUID=$(uuidgen)
 
$ aws sqs receive-message --queue-url $QURL --region $REGION
  --attribute-names All --receive-request-attempt-id $UUID
{
    "Messages": [
        {
            "Body": "helloworld",
            "Attributes": {
                "ApproximateFirstReceiveTimestamp": "1479638590679",
                "SequenceNumber": "18825531333333379616",
                "SenderId": "AIDAJXUQZZZ7FZPNOUMRM",
                "MessageDeduplicationId": "936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af",
                "SentTimestamp": "1479638589763",
                "ApproximateReceiveCount": "5",
                "MessageGroupId": "group1"
            },
            "ReceiptHandle": "AQEB+8sEIDFkOpnHJLbbi/nZgUY4jfwP+y/m4hrf8Qrg0F90Cc3NXROYi1ghcXFVhDjvPNR1TsHmRAeqU+rq0knEyPnX8OOwUtiMty9FEXNiYIAfDq+GCl9509wQUIVwk8rvH02smCRo9RgWXGtqs17XtUvRDnYEyuX8sCMGGbqYTZfgsbtxrSCL2elg5SOV3JNVn3h/iW8UOINgv0xNXMUmYTNYyuoDoJlKRt/9En1I1y9gy+Fdo6+WLOl6rpAFVbBvtFnoOYUj3ecIuXOrktyLdg==",
            "MD5OfBody": "fc5e038d38a57032085441e7fe7010b0",
            "MessageId": "8f932728-5cf1-43a8-be6d-ac3ba8830f7c"
        }
    ]
}

今度は他のメッセージグループIDが取れました。

なお、連続してメッセージを取得しようとすると、グループ数を超えた回数目から何も取得できなくなります。これは可視性タイムアウトが過ぎるまで続きます。

1
2
3
$ aws sqs receive-message --queue-url $QURL --region $REGION --attribute-names All
$ aws sqs receive-message --queue-url $QURL --region $REGION --attribute-names All
$ aws sqs receive-message --queue-url $QURL --region $REGION --attribute-names All

メッセージの削除

取得したメッセージのReceiptHandleを指定してメッセージを削除します。

1
2
3
4
5
6
$ UUID=$(uuidgen)
$ RH=$(aws sqs receive-message --queue-url $QURL --region $REGION
  --attribute-names All --receive-request-attempt-id $UUID
  | jq -r .Messages[].ReceiptHandle)
 
$ aws sqs delete-message --queue-url $QURL --region $REGION --receipt-handle $RH

キューの先頭から1つメッセージを削除しましたので、改めてメッセージを取得すると、次のメッセージが取得されました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ UUID=$(uuidgen)
$ aws sqs receive-message --queue-url $QURL --region $REGION
   --attribute-names All --receive-request-attempt-id $UUID
{
    "Messages": [
        {
            "Body": "morining2",
            "Attributes": {
                "ApproximateFirstReceiveTimestamp": "1479639406758",
                "SequenceNumber": "18825531598680815616",
                "SenderId": "AIDAJXUQ7RG7FZPNOUMRM",
                "MessageDeduplicationId": "c37bc60771b7c18187d9c455edd64b7b35115f351400e432d4eb02318c6918e1",
                "SentTimestamp": "1479638769419",
                "ApproximateReceiveCount": "1",
                "MessageGroupId": "group2"
            },
            "ReceiptHandle": "AQEBsgBd4i7HFqT1Wu59/46FiMnDUYjBuM8TTtLyqBOGDuT3s4fQ04H2W7UGrS5VSVl9fBM/cqs8vpLGLVygPXpdqMiQ38O5EaHdcaEDUKmGCZOj1qIlJojj09RJxwSqKgN6c5HPmzTJhAZdJSBlgaGQSlZFG6xf/0F92m2udWI+6WgONx1vXUxVThF96Fv04vt4fpODtl6Zx+rv/yeb0zOFed2VUQlhC3nJZV5Ezibu7QqxAKEH1l8f0SrcyIihdc8Z8sgq5wiCq9W3Xj+gtzflLg==",
            "MD5OfBody": "d6b5eaab8446ed73a2aef0232643d46e",
            "MessageId": "7be742e7-adb9-4c7b-b265-e2eb4c413dd3"
        }
    ]
}

高速にFIFOするために

ここまで実際に動かしてみて気づいたと思うのですが、なんとなく動きが遅い気がします。おそらく、様々な整合性を取るために裏でチェックが走っているからだと思います。また、グループの先頭しかメッセージを取れませんので、100万件のメッセージが入っていても、グループが1つであれば、ワーカは2つ以上あっても意味がありません。例えば、メッセージの重複だけを排除したいだけで、順序は必要なく、高いスループットでワーカーによる処理を行いたい場合は、メッセージ毎にユニークなUUID等でグループIDを付ければOKです。

こんなときどうなる?

削除したメッセージと同じメッセージ重複削除IDのときの動作

同じメッセージを連続して送ったら重複したメッセージが削除されます。そして、1つ目のメッセージのみ残ります。この状態で、1つ目のメッセージを削除した後に、もう1回同じメッセージを送ったらどうなるでしょうか。答えは、削除された1つ目のみが残っている状態となり、後から入ってくるメッセージは新規に登録されません。短い時間内にキュー内のメッセージが処理されて削除されてしまったとしても、5分以内であれば後から入ってきた重複したメッセージを削除済み扱いとなります。

異なるメッセージグループIDと同じメッセージ重複削除IDの動作

メッセージ重複削除ID(例えば、ContentBasedDeduplicationがTrueにおけるコンテンツハッシュ値)が全く同じ場合において、メッセージグループIDが異なる場合、別物としてキューに蓄積されるか気になります。答えは、メッセージ重複削除IDが同じであれば同じものとして扱われ、連続してキューに送った場合には、1つ目のメッセージのみキューに残ります。もちろん、5分経過すれば、メッセージグループIDが同じか異なるか関係なく、別メッセージとしてキューに残ります。

まとめ

要点をまとめます。

  • 画像変換のような、最低でも必ず1回実行されればOKで、複数回実行されても問題ない処理の場合は今まで通り標準キューを使いましょう。最も安くて早いです。
  • メッセージの重複を避けたいだけの場合は、FIFOキューを使い、メッセージグループID(Message Group ID)をユニークにしましょう。
  • メッセージの順序を守り、重複を避けたい場合は、FIFOキューを使い、適切なメッセージグループIDを使いましょう。
  • メッセージ重複削除ID(Message Deduplication ID)を指定することで、メッセージの重複条件を指定することができます。キュー作成時にコンテンツハッシュ値(SHA256)を指定することもできます。
  • メーッセージ受け取り時は、受信要求試行ID(Receive Request Attempt ID)を用いて万が一時に備えた同じメッセージを取得することもできます。

Amazon SQSのFIFOキューは、今まで独自実装で実現していた業務的な流れの制御を、SQSの仕様でカバーできるようになり、システムをとてもシンプルに開発することができるようになりました。"メッセージグループID"と、"メッセージ重複削除ID"の活用によって、どのような単位で処理の順番を保証するか制御できるようになりました。世の中の多くの業務システムはSQS必須になると予想しています。ぜひご活用ください。















IAM 사용자의 액세스 키 관리

참고https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_credentials_access-keys.html

웹 사이트에서 Amazon 제품을 팔기 위해 Product Advertising API를 구성하기 위해 이 주제를 찾았다면 다음 주제들 단원을 참조하십시오.

액세스 키는 IAM 사용자 또는 AWS 계정 루트 사용자에 대한 장기 자격 증명입니다. 액세스 키를 사용하여 AWS CLI 또는 AWS API에 대한 프로그래밍 요청에 서명할 수 있습니다(직접 또는 AWS SDK를 사용하여). 자세한 내용은 Amazon Web Services 일반 참조의 AWS API 요청 서명 단원을 참조하십시오.

액세스 키액세스 키 ID(예: AKIAIOSFODNN7EXAMPLE)와 보안 액세스 키(예: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)의 2가지 부분으로 구성됩니다. 사용자 이름 및 암호와 같이 액세스 키 ID와 보안 액세스 키를 함께 사용하여 요청을 인증해야 합니다. 사용자 이름과 암호를 관리하는 것처럼 안전하게 액세스 키를 관리합니다.

중요

정식 사용자 ID를 찾는 데 도움이 되더라도 액세스 키를 제3자에게 제공하지 마십시오. 이로 인해 다른 사람에게 계정에 대한 영구 액세스를 제공하게 될 수 있습니다.

가장 좋은 방법은 액세스 키 대신 임시 보안 자격 증명(IAM 역할)을 사용하고 모든 AWS 계정 루트 사용자 액세스 키는 비활성화하는 것입니다. 자세한 내용은 Amazon Web Services 일반 참조의 AWS 액세스 키 관리 모범 사례 단원을 참조하십시오.

장기 액세스 키를 사용해야 하는 경우 액세스 키(액세스 키 ID 및 보안 액세스 키)를 생성, 수정, 보기 또는 교체할 수 있습니다. 최대 두 개의 액세스 키를 가질 수 있습니다. 이렇게 하면 모범 사례에 따라 활성 키를 교체할 수 있습니다.

액세스 키 페어를 생성할 때는 액세스 키 ID와 보안 액세스 키를 안전한 위치에 저장합니다. 보안 액세스 키는 생성할 때만 사용할 수 있습니다. 보안 액세스 키를 분실한 경우 액세스 키를 삭제하고 새 키를 생성해야 합니다. 자세한 내용은 분실하거나 잊어버린 암호 또는 액세스 키 재설정 단원을 참조하십시오.

필요한 권한

IAM 사용자의 액세스 키를 생성하려면 다음 정책에 대한 권한이 있어야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ViewAddAccessKeysForUser", "Effect": "Allow", "Action": [ "iam:GetUser", "iam:CreateAccessKey", "iam:ListAccessKeys" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "ListUsersInConsole", "Effect": "Allow", "Action": "iam:ListUsers", "Resource": "*" } ] }

IAM 사용자의 액세스 키를 교체하려면 다음 정책에 대한 권한이 있어야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ManageAccessKeysForUser", "Effect": "Allow", "Action": [ "iam:DeleteAccessKey", "iam:GetAccessKeyLastUsed", "iam:UpdateAccessKey", "iam:GetUser", "iam:CreateAccessKey", "iam:ListAccessKeys" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "ListUsersInConsole", "Effect": "Allow", "Action": "iam:ListUsers", "Resource": "*" } ] }

액세스 키 관리(콘솔)

AWS Management 콘솔을 사용하여 IAM 사용자의 액세스 키를 관리할 수 있습니다.

IAM 사용자의 액세스 키를 생성, 수정 또는 삭제하려면(콘솔)

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 사용자를 선택합니다.

  3. 액세스 키를 관리하려는 사용자 이름을 선택한 다음 보안 자격 증명 탭을 선택합니다.

  4. 액세스 키 섹션에서 다음 작업을 수행합니다.

    • 액세스 키를 생성하려면 Create access key(액세스 키 생성)을 선택합니다. 그런 다음 .csv 파일 다운로드를 선택하여 액세스 키 ID 및 보안 액세스 키를 컴퓨터에 CSV 파일로 저장합니다. 안전한 위치에 파일을 저장합니다. 이 대화 상자를 닫은 후에는 보안 액세스 키에 다시 액세스할 수 없습니다. CSV 파일을 다운로드한 후 [Close]를 클릭합니다. 액세스 키를 생성하면 키 페어가 기본적으로 활성화되므로 해당 페어를 즉시 사용할 수 있습니다.

    • 활성 상태의 액세스 키를 비활성화하려면 비활성화를 선택합니다.

    • 비활성 상태의 액세스 키를 다시 활성화하려면 활성화를 선택합니다.

    • 액세스 키를 삭제하려면 행의 맨 왼쪽에 있는 X 버튼을 선택합니다. 삭제를 선택하여 확인합니다. 액세스 키를 삭제하면 영구 삭제되어 되돌릴 수 없습니다. 그러나 언제든지 새 키를 만들 수 있습니다.

IAM 사용자에 대한 액세스 키를 나열하려면(콘솔)

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 사용자를 선택합니다.

  3. 해당 사용자의 이름을 선택한 후 보안 자격 증명 탭을 선택합니다. 사용자의 액세스 키와 각 키의 상태가 표시됩니다.

    참고

    사용자의 액세스 키 ID만 표시됩니다. 보안 액세스 키는 키를 만들 때만 가져올 수 있습니다.

여러 IAM 사용자의 액세스 키 ID를 나열하려면(콘솔)

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 사용자를 선택합니다.

  3. 필요할 경우 다음 단계를 통해 사용자 테이블에 액세스 키 ID 열을 추가합니다.

    1. 테이블 위 맨 오른쪽에서 설정 아이콘( 
                           Settings icon
                         )을 선택합니다.

    2. Manage columns(열 관리)에서 액세스 키 ID를 선택합니다.

    3. 닫기를 선택하여 사용자 목록으로 돌아갑니다.

  4. 액세스 키 ID 열에는 각 액세스 키 ID가 표시되고 그 다음에 키의 상태가 표시됩니다. 예: 23478207027842073230762374023 (Active) 또는 22093740239670237024843420327 (Inactive).

    이 정보를 사용하여 한 개 또는 두 개의 액세스 키를 가진 사용자의 액세스 키를 보고 복사할 수 있습니다. 액세스 키가 없는 사용자는 이 열에 없음이라고 표시됩니다.

    참고

    사용자의 액세스 키 ID와 상태만 표시됩니다. 보안 액세스 키는 키를 만들 때만 가져올 수 있습니다.

어떤 IAM 사용자가 특정 액세스 키를 소유하고 있는지 확인하려면(콘솔)

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 사용자를 선택합니다.

  3. 검색 상자에 해당 사용자의 액세스 키 ID를 입력하거나 붙여 넣습니다.

  4. 필요할 경우 다음 단계를 통해 사용자 테이블에 액세스 키 ID 열을 추가합니다.

    1. 테이블 위 맨 오른쪽에서 설정 아이콘( 
                           Settings icon
                         )을 선택합니다.

    2. Manage columns(열 관리)에서 액세스 키 ID를 선택합니다.

    3. 닫기를 선택하여 사용자 목록으로 돌아간 후 지정된 액세스 키를 소유하는 사용자로 필터링되었는지 확인합니다.

액세스 키 관리(AWS CLI)

AWS CLI에서 IAM 사용자의 액세스 키를 관리하려면 다음 명령을 실행합니다.

액세스 키 관리(AWS API)

AWS API에서 IAM 사용자의 액세스 키를 관리하려면 다음 작업을 호출합니다.

액세스 키 교체

최상의 보안을 위해 IAM 사용자 액세스 키를 정기적으로 교체(변경)하는 것이 좋습니다. 관리자가 필요한 권한을 부여한 경우 사용자 고유의 액세스 키를 교체할 수 있습니다.

관리자가 사용자에게 액세스 키를 직접 교체할 수 있는 권한을 부여하는 방법에 대한 자세한 내용은 사용자가 자신의 암호, 액세스 키, SSH 키를 관리할 수 있도록 허용 단원을 참조하십시오. 또한, 모든 IAM 사용자가 주기적으로 암호를 교체하도록 요구하는 암호 정책을 계정에 적용할 수 있습니다. 얼마나 자주 교체하도록 할지 선택할 수 있습니다. 자세한 내용은 IAM 사용자의 계정 암호 정책 설정 단원을 참조하십시오.

중요

가장 좋은 방법은 AWS 계정 루트 사용자를 사용하지 않는 것입니다. AWS 계정 루트 사용자 자격 증명을 사용할 경우 그 자격 증명도 정기적으로 교체할 것을 권장합니다. 계정 암호 정책은 루트 사용자 자격 증명에는 적용되지 않습니다. IAM 사용자는 AWS 계정 루트 사용자의 자격 증명을 관리할 수 없으므로 루트 사용자의 자격 증명(사용자의 자격 증명이 아님)을 사용하여 루트 사용자 자격 증명을 변경해야 합니다. AWS의 일상적인 작업에서는 루트 사용자를 사용하지 않는 것이 좋습니다.

액세스 키 교체(콘솔)

AWS Management 콘솔에서 액세스 키를 교체할 수 있습니다.

애플리케이션을 중단하지 않고 액세스 키를 교체하려면(콘솔)

  1. 최초 액세스 키가 활성 상태일 때 두 번째 액세스 키를 만듭니다.

    1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

    2. 탐색 창에서 사용자를 선택합니다.

    3. 해당 사용자의 이름을 선택한 후 보안 자격 증명 탭을 선택합니다.

    4. Create access key(액세스 키 생성)을 선택하고 Download .csv file(.csv 파일 다운로드)를 선택하여 액세스 키 ID와 보안 액세스 키를 컴퓨터의 .csv 파일에 저장합니다. 안전한 위치에 파일을 저장합니다. 이 단계를 끝낸 후에는 보안 액세스 키에 다시 액세스할 수 없습니다. .csv 파일을 다운로드한 후 닫기를 클릭합니다.

      새 액세스 키는 기본적으로 활성화됩니다. 따라서 사용자에게 두 개의 활성 액세스 키가 생깁니다.

  2. 새 액세스 키를 사용하도록 모든 애플리케이션과 도구를 업데이트합니다.

  3. 가장 오래된 액세스 키의 Last used(마지막 사용) 열을 검토하여 최초 액세스 키가 아직 사용 중인지 확인합니다. 한 가지 접근 방식은 며칠을 기다린 다음 계속하기 전에 사용된 적이 있는 기존 액세스 키가 있는지 확인하는 것입니다.

  4. Last used(마지막 사용) 열에 오래된 키가 사용된 적이 없다고 표시되더라도 최초 액세스 키를 바로 삭제하지 않는 것이 좋습니다. 대신 Make inactive(비활성화)를 선택하여 최초 액세스 키를 비활성화합니다.

  5. 새 액세스 키만 사용하여 애플리케이션이 작동 중인지 확인합니다. 원래 액세스 키를 계속 사용하는 어떤 애플리케이션도 AWS 리소스에 더 이상 액세스할 수 없기 때문에 이 시점에 작업을 중단합니다. 그러한 애플리케이션 또는 도구를 찾는다면 활성화(Make active)를 선택하여 최초 액세스 키를 다시 활성화할 수 있습니다. 그런 다음 단계 3 단원으로 돌아가 이 애플리케이션을 업데이트하여 새 키를 사용하십시오.

  6. 일정 기간 기다린 후 모든 애플리케이션과 도구가 업데이트되었는지 확인한 뒤에 최초 액세스 키를 삭제할 수 있습니다:

    1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

    2. 탐색 창에서 사용자를 선택합니다.

    3. 해당 사용자의 이름을 선택한 후 보안 자격 증명 탭을 선택합니다.

    4. 삭제할 액세스 키를 찾아 해당 행 맨 오른쪽에 있는 X 버튼을 선택합니다. 삭제를 선택하여 확인합니다.

액세스 키 교체 시점을 결정하려면(콘솔)

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 사용자를 선택합니다.

  3. 필요할 경우 다음 단계를 통해 사용자 테이블에 Access key age(액세스 키 수명) 열을 추가합니다.

    1. 테이블 위 맨 오른쪽에서 설정 아이콘( 
                              Settings icon
                            )을 선택합니다.

    2. Manage Columns(열 관리)에서 Access key age(액세스 키 수명)을 선택합니다.

    3. 닫기를 선택하여 사용자 목록으로 돌아갑니다.

  4. Access key age(액세스 키 수명) 열에는 가장 오래된 활성 액세스 키가 생성된 이후로 경과한 일수가 표시됩니다. 이 정보를 사용하여 교체가 필요한 액세스 키를 소유한 사용자를 확인할 수 있습니다. 액세스 키가 없는 사용자는 이 열에 없음이라고 표시됩니다.

액세스 키 교체(AWS CLI)

AWS Command Line Interface에서 액세스 키를 교체할 수 있습니다.

애플리케이션을 중단하지 않고 액세스 키를 교체하려면(AWS CLI)

  1. 최초 액세스 키가 활성 상태일 때 두 번째 액세스 키를 만들면 이 키도 기본적으로 활성 상태가 됩니다. 다음 명령을 실행합니다.

  2. 새 액세스 키를 사용하도록 모든 애플리케이션과 도구를 업데이트합니다.

  3. 다음 명령을 사용하여 최초 액세스 키가 아직 사용 중인지 확인합니다.

    한 가지 접근 방식은 며칠을 기다린 다음 계속하기 전에 사용된 적이 있는 기존 액세스 키가 있는지 확인하는 것입니다.

  4. 단계 3 단계를 통해 기존 키를 사용한 적이 없다는 것이 밝혀진 경우 최초의 액세스 키를 즉시 삭제하지 말 것을 권장합니다. 그 대신 다음 명령을 사용하여 최초 액세스 키의 상태를 Inactive로 변경하십시오.

  5. 새 액세스 키만 사용하여 애플리케이션이 작동 중인지 확인합니다. 원래 액세스 키를 계속 사용하는 어떤 애플리케이션도 AWS 리소스에 더 이상 액세스할 수 없기 때문에 이 시점에 작업을 중단합니다. 그러한 애플리케이션 또는 도구를 찾는다면 그 상태를 Active로 되돌려 최초 액세스 키를 다시 활성화할 수 있습니다. 그런 다음 단계 2 단계로 돌아가 이 애플리케이션을 업데이트해 새 키를 사용하십시오.

  6. 일정 기간 기다린 후 모든 애플리케이션과 도구가 업데이트되었는지 확인한 뒤에 다음 명령을 사용하여 최초 액세스 키를 삭제할 수 있습니다.

자세한 내용은 다음 단원을 참조하십시오.

액세스 키 교체(AWS API)

AWS API를 사용하여 액세스 키를 교체할 수 있습니다.

애플리케이션을 중단하지 않고 액세스 키를 교체하려면(AWS API)

  1. 최초 액세스 키가 활성 상태일 때 두 번째 액세스 키를 만들면 이 키도 기본적으로 활성 상태가 됩니다. 다음 작업을 호출합니다.

    • CreateAccessKey

      따라서 사용자에게 두 개의 활성 액세스 키가 생깁니다.

  2. 새 액세스 키를 사용하도록 모든 애플리케이션과 도구를 업데이트합니다.

  3. 다음 연산을 호출하여 최초 액세스 키가 아직 사용 중인지 확인합니다.

    한 가지 접근 방식은 며칠을 기다린 다음 계속하기 전에 사용된 적이 있는 기존 액세스 키가 있는지 확인하는 것입니다.

  4. 단계 3 단계를 통해 기존 키를 사용한 적이 없다는 것이 밝혀진 경우 최초의 액세스 키를 즉시 삭제하지 말 것을 권장합니다. 그 대신 다음 연산을 호출하여 최초 액세스 키의 상태를 Inactive로 변경하십시오.

  5. 새 액세스 키만 사용하여 애플리케이션이 작동 중인지 확인합니다. 원래 액세스 키를 계속 사용하는 어떤 애플리케이션도 AWS 리소스에 더 이상 액세스할 수 없기 때문에 이 시점에 작업을 중단합니다. 그러한 애플리케이션 또는 도구를 찾는다면 그 상태를 Active로 되돌려 최초 액세스 키를 다시 활성화할 수 있습니다. 그런 다음 단계 2 단계로 돌아가 이 애플리케이션을 업데이트해 새 키를 사용하십시오.

  6. 일정 기간 기다린 후 모든 애플리케이션과 도구가 업데이트되었는지 확인한 뒤에 다음 연산을 호출하여 최초 액세스 키를 삭제할 수 있습니다.

자세한 내용은 다음 단원을 참조하십시오.


Amazon EBS 스냅샷 삭제(https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ebs-deleting-snapshot.html)

스냅샷을 삭제하면 해당 스냅샷에서만 참조하는 데이터만 제거됩니다. 볼륨의 이전 스냅샷을 삭제해도 해당 볼륨의 이후 스냅샷으로 볼륨을 복원하는 기능에는 영향을 주지 않습니다.

볼륨의 스냅샷을 삭제해도 해당 볼륨에는 아무런 영향을 미치지 않습니다. 볼륨을 삭제해도 해당 볼륨에서 만들어진 스냅샷에는 아무런 영향을 미치지 않습니다.

볼륨의 스냅샷이 주기적으로 생성되는 경우 스냅샷은 증분식입니다. 즉 마지막 스냅샷 이후 변경된 디바이스의 블록만 새 스냅샷에 저장됩니다. 스냅샷은 증분식으로 저장되지만 스냅샷 삭제 프로세스는 볼륨을 복구하기 위해 가장 최근의 스냅샷만을 유지할 수 있도록 설계됩니다.

스냅샷을 삭제해도 조직의 데이터 스토리지 비용이 줄어들지 않을 수 있습니다. 다른 스냅샷은 해당 스냅샷의 데이터를 참조할 수 있으며, 참조된 데이터는 항상 보존됩니다. 이후의 스냅샷에서 사용 중인 데이터가 포함된 스냅샷을 삭제하는 경우, 참조된 데이터와 관련된 비용이 이후의 스냅샷에 할당됩니다. 스냅샷이 데이터를 저장하는 방법에 대한 자세한 정보는 증분 스냅샷의 작동 방법 및 아래 예를 참조하십시오.

다음 다이어그램에서 볼륨 1은 세 가지 시점에 표시됩니다. 스냅샷이 첫 두 상태를 각각 캡처했으며, 세 번째에서는 스냅샷이 삭제되었습니다.

  • 상태 1의 볼륨에는 10GiB의 데이터가 있습니다. 스냅 A는 이 볼륨의 첫 번째 스냅샷이므로 10GiB 데이터 전체를 복사해야 합니다.

  • 상태 2의 볼륨에는 여전히 10GiB의 데이터가 있지만 4GiB가 변경되었습니다. 스냅 B는 스냅 A를 만든 후 변경된 4GiB만 복사하고 저장해야 합니다. 스냅 A에 이미 복사되어 저장된 변경되지 않은 나머지 6GiB 데이터는 (다시) 복사되는 것이 아니라 스냅 B에서 참조됩니다. 이는 파선 모양 화살표로 표시됩니다.

  • 상태 3에서 볼륨은 상태 2 이후로 변경되지 않았지만 스냅샷 A가 삭제되었습니다. 스냅샷 A에 저장된 6GiB의 데이터를 스냅샷 B에서 참조했었지만 굵은 화살표로 표시되었듯이 이제 스냅샷 B로 이동했습니다. 결과적으로 스냅 A에서 보존된 변경되지 않은 6GiB의 데이터와 스냅 B에서 변경된 4GiB의 데이터를 합쳐, 여전히 10GiB의 데이터를 저장한 것이 됩니다.

예 1: 다른 스냅샷에서 참조된 데이터가 포함된 스냅샷 삭제


        스냅 A에는 6GiB의 참조된 데이터가 있습니다. 스냅 A를 삭제하면 해당 데이터가 스냅 B로 병합됩니다.

등록된 AMI에서 사용된 EBS 볼륨의 루트 디바이스에 대한 스냅샷을 삭제할 수 없음에 유의하십시오. 스냅샷을 삭제하기 전 우선 AMI를 등록해야 합니다. 자세한 정보는 Linux AMI 등록 취소 단원을 참조하십시오.

콘솔을 이용하여 스냅샷을 삭제하려면

  1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 스냅샷을 선택합니다.

  3. 스냅샷을 선택한 다음 작업 목록에서 삭제를 선택합니다.

  4. 예, 삭제를 선택합니다.

명령줄을 이용하여 스냅샷을 삭제하려면

다음 명령 중 하나를 사용할 수 있습니다. 명령줄 인터페이스에 대한 자세한 정보는 Amazon EC2에 액세스 단원을 참조하십시오.

참고

진행 중인 스냅샷을 삭제할 수는 있지만, 삭제가 적용되려면 해당 스냅샷이 완전해야 합니다. 여기에는 시간이 오래 걸릴 수 있습니다. 동시 스냅샷 제한 상태(스냅샷 다섯 개를 진행 중)에서 스냅샷을 추가로 만들려고 하면 ConcurrentSnapshotLimitExceeded 오류를 받을 수 있습니다.




超簡単!今すぐ使える「クロスアカウントアクセス」

https://dev.classmethod.jp/cloud/aws/signin-with-cross-account-access/




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

switchRole

こんにちは!ももんが大好きの小山です。

きょうは、「便利なんだろうなあ」と思いつつ試したことがなかったクロスアカウントアクセスを設定してみました。本当に簡単にできたので、まだ試したことがないという方はぜひやってみてください!

クロスアカウントアクセスとは

あなたは、今まで所有していたアカウントA (123423453456) に加えてアカウントB (654354324321) のリソースを管理することになりました。そこであなたはアカウントBに新しいIAMユーザーを作成しましたが、これによって管理すべきログイン情報が増えてしまいました。しばらくすると、こんな不安が生まれます。「今は構わないけど、もっとアカウントが増えたらどうなるんだろうか...」

そこでクロスアカウントアクセスの出番です! クロスアカウントアクセスを使うと、「アカウントAのプリンシパル」から「アカウントBのリソース」を操作できるようになります。

プリンシパルは、アクションを実行してリソースにアクセスできる AWS 内のエンティティです。AWS アカウント("root" ユーザー)、IAM ユーザー、またはロールをプリンシパルにすることができます。次の 2 つの方法のいずれかを使用して、リソースへのアクセス権限を付与できます。

ユーザー(直接、またはグループ経由で間接的に)またはロールに対し、アクセス権限ポリシーをアタッチすることができます。 リソースベースのポリシーをサポートするサービスについては、リソースにアタッチされているポリシーの Principal 要素でプリンシパルを指定できます。 AWS アカウントをプリンシパルにする場合、通常はアカウント内で定義されているすべてのプリンシパルが対象となります。

ロールに関する用語と概念 - AWS Identity and Access Management

1
2
3
4
5
6
7
8
9
10
11
12
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::654354324321:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

とにかくやってみましょう!

アカウントBの準備

まずはアカウントBの Identity and Access Management (IAM) コンソールを開きます。

Console-IAM

画面左のナビゲーションペインからRolesを開いて、Create New Roleを選択します。

Bildschirmfoto 2016-05-25 um 15.40.25

Set Role Nameページでは、任意の名称を入力してNext Stepを選択しましょう。

Set_Role_Name

Select Role Typeページでは、Provide access between... (Role for Cross-Account Access) を選択します。

Select_Role_Type

Establish Trustページでは、アカウントAのIDを入力してNext Stepを選択します。ここで Require MFA を選択すると、アカウントAでサインインに使用したIAMユーザーで多要素認証が有効でなかった場合のアクセスを拒否することができます。

Establish_Trust

Attach Policyページでは、与えたい権限が記述されたポリシーを選択します。今回は AWS 管理ポリシーのひとつを選択しましたが、あらかじめ用意したカスタム管理ポリシーを選択することもできます。

管理ポリシーとインラインポリシー - AWS Identity and Access Management

Bildschirmfoto 2016-05-25 um 16.17.04

Reviewページでは、内容を確かめてCreate Roleを選択しましょう。

Review

新しいIAMロールが作成できました! 赤く囲った部分のリンクを控えておきましょう。

Bildschirmfoto 2016-05-25 um 16.36.04

やってみる前に

クロスアカウントアクセスに用いるIAMユーザー (アカウントA) には、スイッチロールのための許可が必要です。以下のようなポリシーを割り当てて、sts:AssumeRoleアクションを許可しましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::654354324321:role/switchFrom-123423453456"
            ]
        }
    ]
}

アカウント/IAMロールにかかわらずスイッチを許可したい場合は、リソース名をワイルドカードで置き換えます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

やってみる

アカウントAの Identity and Access Management (IAM) コンソールを開いて、ナビゲーションバーの右端に表示されたIAMユーザーを選択します。表示されたメニューからSwitch Roleを選択しましょう。

Switch_Role

もう一度Switch Roleを選択します。

Switch_Role

Switch Roleページでは、アカウントBのIDとクロスアカウントアクセスのために作成したIAMロールの名称を指定してSwitch Roleボタンを選択します。

Switch_Role

パスワードを入力することなく、アカウントBのマネジメントコンソールを開くことができました! ナビゲーションバーの右端には、クロスアカウントアクセスに使用したIAMロールが表示されています。これを選択すると...

左側にはアカウントAでサインインに使用したIAMユーザー、右側にはクロスアカウントアクセスで用いたIAMロールが表示されます。アカウントAに戻りたいときは、青く囲ったBack to IAM_Userを選択しましょう!

おわりに

いかがでしたか? マネジメントコンソールを使うと、クロスアカウントアクセスを簡単に設定できることがわかりました。ここで用いられる Switch Role 機能は、マネジメントコンソールが AWS Security Token Service(STS) の AssumeRole API を呼び出すことにより実現しています。詳細について関心のある方は、ぜひ以下の記事をご覧になってください! いかに IAM が面白い機能であるかということを実感してもらえると思います。

IAMロール徹底理解 〜 AssumeRoleの正体 | Developers.IO

したっけまた!

IAM とは - AWS Identity and Access Management

IAM ユーザーにアクセス権限を委任するロールの作成 - AWS Identity and Access Management

ロールの切り替え(AWS マネジメントコンソール) - AWS Identity and Access Management





Amazon EC2 API ToolsをインストールしてEC2インスタンスを起動する(&ログインするまで)

  

Amazon Web Services

仕事でAmazon WebServices(AWS)をよく使っています。AWSで仮想サーバ(EC2インスタンス)を立ち上げたり、スナップショット(バックアップ)を作成して復元などが簡単にできるためサーバ構築などに大変便利ですね。 AWSコンポーネント(EC2, RDS, ELBなど)を操作するのにGUI(Management Console)で操作するのですが、APIも提供されており、シェルスクリプト(コマンド)やPHPRubyなどのプログラムからも操作することができます。 今回はBashなどのシェル(コマンド)からEC2インスタンスを操作できるツールをインストールし、EC2インスタンスを起動してみます。

今回の目標

サーバ環境

必要なパッケージのインストール

$ sudo yum -y install java-1.6.0-openjdk

ファイルのダウンロード

$ wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
$ unzip ec2-api-tools.zip

ファイルの設置

どこに置いてもいいのですが、/awsというディレクトリを作成してそこに先ほどのツール郡を置きます。

$ sudo mkdir /aws
$ sudo mv ec2-api-tools-1.6.7.4 /aws/ec2

パスの設定

コマンドが使えるようにパスを通します。

# ~/.bashrc

# Amazon API Tools
PATH=$PATH:/aws/ec2/bin

環境変数の設定

コマンドを実行するのに必要な環境変数を設定します。

# .bashrc

# Amazon API Tools
PATH=$PATH:/aws/ec2/bin

# AWS Command Line Tools
export AWS_ACCESS_KEY="xxxxxxxxxxxxxxxxxxx"
export AWS_SECRET_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export JAVA_HOME=/usr/lib/jvm/jre
export EC2_AMITOOL_HOME=/aws/ec2
export EC2_HOME=/aws/ec2
export EC2_URL="https://ec2.ap-northeast-1.amazonaws.com"
export EC2_REGION="ap-northeast-1"

AWS_ACCESS_KEY はAWSAPIを利用するのに必要なアクセスキー、AWS_SECRET_KEY はシークレットキーです。 これらのキーはAWSのManagementConsoleから発行してください *1

.bashrcを読みこめば完了です。

$ source ~/.bashrc

動作確認

EC2インスタンスが使えるリージョン(地域)を一覧表示させるコマンド(ec2-describe-regions)を実行します。

$ ec2-describe-regions
REGION  eu-west-1       ec2.eu-west-1.amazonaws.com
REGION  sa-east-1       ec2.sa-east-1.amazonaws.com
REGION  us-east-1       ec2.us-east-1.amazonaws.com
REGION  ap-northeast-1  ec2.ap-northeast-1.amazonaws.com
REGION  us-west-2       ec2.us-west-2.amazonaws.com
REGION  us-west-1       ec2.us-west-1.amazonaws.com
REGION  ap-southeast-1  ec2.ap-southeast-1.amazonaws.com
REGION  ap-southeast-2  ec2.ap-southeast-2.amazonaws.com

正しく設定されていれば、リージョンの一覧が表示されるはずです。

コマンドからEC2インスタンスを起動する

EC2インスタンスを設定し起動するには、ec2-run-instancesコマンドを使います。

AMIの選択

ec2-run-instancesコマンドを使うには、AMIから起動する必要があるため、どのAMIから起動するかを決めます。 すでにAMIを作成していて、そのAMIから起動したい場合は、そのAMI ID(ami-xxxxxxxx)を選択してください。 今回はAMIが無いので、Community AMIs を含めたAMIから探します。例としてamzn-ami-pv-2014.03.0.x86_64-ebs というAMIから起動することにします。AMI IDは、ami-a1bec3a0 です。

$ ec2-describe-images -x all | grep IMAGE | grep amzn-ami-pv-2014.03.0.x86_64-ebs

IMAGE   ami-a1bec3a0    amazon/amzn-ami-pv-2014.03.0.x86_64-ebs amazon  available       public          x86_64machine aki-176bf516                    ebs     paravirtual     xen

SecurityGroupの作成

SecurityGroupというファイアウォール(iptablesみたいなもの)を作成します。 今回はquick-startという簡単なSecurityGroupを作成しました。SSH(22番)ポートのみを許可しています。

quick-start

Key Pairの作成

EC2インスタンスは公開鍵認証なので、Key Pairとよばれる秘密鍵を作成します。 今回はjicomanという名前で作成しました*2

EC2インスタンスの起動

ようやくEC2インスタンスを起動します。

$ ec2-run-instances ami-a1bec3a0 \
--instance-count 1 \
--group quick-start \
--key jicoman \
--instance-type t1.micro \
--instance-initiated-shutdown-behavior stop \
--availability-zone ap-northeast-1c \
--region ap-northeast-1

RESERVATION     r-bbb38ebd      031388413724    quick-start
INSTANCE        i-b34a53b5      ami-a1bec3a0                    pending jicoman 0               t1.micro     2014-04-01T15:48:43+0000 ap-northeast-1c aki-176bf516                    monitoring-disabled                  ebs                                      paravirtual     xen             sg-d3576ad2     default false

正しく実行されると、EC2インスタンスが起動します。 インスタンスID(i-b34a53b5)は後ほど、停止や削除に使います。

下記、オプションの解説です。

オプション説明
--instance-count起動するEC2インスタンスの数
--groupEC2インスタンスを所属させるSecurityGroup名
--keyEC2インスタンスSSHログインするためのKeyPair名
--instance-type起動するEC2インスタンスインスタンスタイプ
--instance-initiated-shutdown-behaviorEC2インスタンスを停止できるようにするかどうか
--availability-zone起動するEC2インスタンスに所属させるアベイラビリティゾーン(AZ)
--region起動するEC2インスタンスに所属させるリージョン

EC2インスタンスが起動されると、ManagementConsoleで以下のように表示されます。

EC2インスタンス起動

SSHログインする

起動したEC2インスタンスにログインしてみます。 デフォルトのユーザはec2-userです。

秘密鍵(.pem)のファイルパーミッションを変更

Key Pairを作成した時にダウンロードした秘密鍵(例としてjicoman.pem)のファイルパーミッションを変更します。 変更せず644(-rw-r--r--)などにするとSSH接続時に以下のようなエラーが表示されます。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/hoge/.ssh/jicoman.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /home/hoge/.ssh/jicoman.pem
Permission denied (publickey).
$ chmod 600 /home/hoge/.ssh/jicoman.pem

SSHコマンドを実行します。

$ ssh -i /home/hoge/.ssh/jicoman.pem ec2-user@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
No packages needed for security; 19 packages available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$

接続するEC2インスタンスのホスト名(Public DNS)は起動する度に変更されますので随時確認してください。

EC2インスタンスを停止(stop)する

AWSは従量課金なので起動時間が長いほど請求金額が高くなりますので使い終わったら停止(stop)または削除(terminate)してください。 コマンドでEC2インスタンスを停止してみます。EC2インスタンスからログアウト(exit)して下記のコマンドを実行します。

$ ec2-stop-instances i-b34a53b5
INSTANCE        i-b34a53b5      running stopping

ec2-stop-instancesコマンドを使うときに、先ほどのEC2インスタンスインスタンスIDを指定します。

EC2インスタンスを削除(terminate)する

EC2インスタンスをstopさせれば課金されることはありませんが、使い終わったら削除(terminate)しておいた方が(精神的に)安全でしょう。

EC2インスタンスをTerminteするには、ec2-terminate-instances コマンドを実行します。

$ ec2-terminate-instances i-b34a53b5
INSTANCE        i-b34a53b5      stopped terminated

最後に

コマンドからEC2インスタンスを操作できるようになりました。 EC2インスタンスの他にもELBやRDSなどのツールも提供されており、設定すれば同じように操作することができます。 次回は先ほど設定したアクセスキーとシークレットキーの取得方法を取り上げたいと思います。

参考URL

*1:次回、記事を書く予定です


Amazon EC2 루트 디바이스 볼륨(https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/RootDeviceStorage.html)

사용자가 인스턴스를 시작할 때 루트 디바이스 볼륨에는 인스턴스를 부팅하는 데 사용된 이미지가 들어 있습니다. Amazon EC2가 출시되었던 시점에서는 Amazon EC2 인스턴스 스토어가 모든 AMI를 지원했으므로 AMI에서 시작한 인스턴스의 루트 디바이스는 Amazon S3에 저장된 템플릿으로부터 생성된 인스턴스 스토어 볼륨이었습니다. Amazon EBS가 출시된 후에는 Amazon EBS의 지원을 받는 AMI가 도입되었습니다. 따라서 AMI에서 시작한 인스턴스의 루트 디바이스는 Amazon EBS 스냅샷으로부터 생성된 Amazon EBS 볼륨입니다.

사용자는 Amazon EC2 인스턴스 스토어가 지원하는 AMI와 Amazon EBS에서 지원하는 AMI 중에서 선택할 수 있습니다. 시작 속도가 더 빠르고 영구 스토리지를 사용하는 Amazon EBS 지원 AMI를 사용하는 것이 좋습니다.

루트 볼륨에 대해 Amazon EC2에서 사용하는 디바이스 이름에 대한 자세한 내용은 Linux 인스턴스의 디바이스 명명 단원을 참조하십시오.

루트 디바이스 스토리지 개념

인스턴스 스토어 지원 AMI 또는 Amazon EBS 지원하는 AMI에서 인스턴스를 시작할 수 있습니다. AMI 설명에는 AMI의 유형이 포함되며, 설명 중간에 루트 디바이스가 ebs(Amazon EBS 지원) 또는 instance store(인스턴스 스토어 지원)로 언급됩니다. 각 AMI 유형별로 수행할 수 있는 작업이나 기능이 달라지기 때문에 이 차이점을 아는 것이 중요합니다. 해당 차이점에 대한 자세한 내용은 루트 디바이스 스토리지 단원을 참조하십시오.


인스턴스 스토어 지원 인스턴스

인스턴스 스토어를 루트 디바이스로 사용하는 인스턴스는 하나 이상의 인스턴스 스토어 볼륨을 자동으로 사용할 수 있으며, 이러한 볼륨 중 하나가 루트 디바이스 볼륨 역할을 합니다. 인스턴스가 시작되면 인스턴스를 부팅하는 데 사용된 이미지가 루트 볼륨으로 복사됩니다. 인스턴스 유형에 따라 다른 인스턴스 스토어 볼륨을 사용할 수도 있습니다.

인스턴스 스토어 볼륨의 모든 데이터는 인스턴스가 실행되는 동안 유지되지만, 인스턴스가 종료되거나(인스턴스 스토어 지원 인스턴스는 [Stop] 작업을 지원하지 않음) 장애가 발생하면(예: 기본 드라이브에 문제가 있는 경우) 데이터가 삭제됩니다.

 Amazon EC2 인스턴스 스토어가 지원하는 인스턴스의 루트 디바이스

인스턴스 스토어가 지원하는 인스턴스는 종료되거나 장애가 발생할 경우 복원이 불가능합니다. Amazon EC2 인스턴스 스토어가 지원하는 인스턴스를 사용하려는 경우 여러 가용 영역의 인스턴스 스토어로 데이터를 분산하는 것이 좋습니다. 또한 인스턴스 스토어 볼륨의 중요한 데이터를 정기적으로 영구 스토리지로 백업해야 합니다.

자세한 내용은 Amazon EC2 인스턴스 스토어 단원을 참조하십시오.

Amazon EBS 지원 인스턴스

Amazon EBS를 루트 디바이스로 사용하는 인스턴스에는 자동으로 Amazon EBS 볼륨이 연결됩니다. Amazon EBS 지원 인스턴스를 시작하면 사용하는 AMI가 참조하는 각 Amazon EBS 스냅샷에 대한 Amazon EBS 볼륨이 생성됩니다. 인스턴스 유형에 따라 다른 Amazon EBS 볼륨이나 인스턴스 스토어 볼륨을 사용할 수도 있습니다.

 Amazon EBS 지원 인스턴스의 루트 디바이스 볼륨 및 기타 Amazon EBS 볼륨

Amazon EBS 지원 인스턴스는 중지한 후 다시 시작해도 연결된 볼륨에 저장된 데이터에 아무런 영향이 없습니다. Amazon EBS 지원 인스턴스가 중지 상태일 때 다양한 인스턴스 및 볼륨 관련 작업을 수행할 수 있습니다. 예를 들어 인스턴스의 속성을 수정하거나, 인스턴스의 크기를 변경하거나, 사용하는 커널을 업데이트하거나, 디버깅 등의 목적으로 루트 볼륨을 실행 중인 다른 인스턴스에 연결할 수 있습니다.

Amazon EBS 지원 인스턴스에서 장애가 발생할 경우 다음 방법 중 하나로 세션을 복원할 수 있습니다.

  • 중지 후 다시 시작합니다(먼저 이 방법 시도).

  • 모든 관련 볼륨의 스냅샷을 자동으로 생성하고 새 AMI를 생성합니다. 자세한 내용은 Amazon EBS 지원 Linux AMI 생성 단원을 참조하십시오.

  • 다음 단계에 따라 볼륨에 새 인스턴스를 연결합니다.

    1. 루트 볼륨의 스냅샷을 생성합니다.

    2. 스냅샷을 사용하여 새 AMI를 등록합니다.

    3. 새 AMI에서 새 인스턴스를 시작합니다.

    4. 나머지 Amazon EBS 볼륨을 이전 인스턴스에서 분리합니다.

    5. Amazon EBS 볼륨을 새 인스턴스에 다시 연결합니다.

자세한 내용은 Amazon EBS 볼륨 단원을 참조하십시오.

루트 디바이스 유형에 따른 AMI 선택

인스턴스를 시작할 때 지정하는 AMI가 인스턴스의 루트 디바이스 볼륨 유형을 결정합니다.

콘솔을 사용하여 Amazon EBS 지원 AMI를 선택하려면 다음을 수행합니다.

  1. Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 [AMIs]를 선택합니다.

  3. 필터 목록에서 [Public images] 등의 이미지 유형을 선택합니다. 검색 창에서 [Platform]을 선택하고 [Amazon Linux] 등의 운영 체제를 선택한 후 [Root Device Type]을 선택하고 [EBS images]를 선택합니다.

  4. (선택 사항) 결정에 도움이 되는 추가 정보를 얻으려면 [Show/Hide Columns] 아이콘을 선택하고 표시할 열을 업데이트한 후 [Close]를 선택합니다.

  5. AMI를 선택하고 AMI ID를 메모해 둡니다.

콘솔을 사용하여 인스턴스 스토어 지원 AMI를 선택하려면 다음을 수행합니다.

  1. Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 [AMIs]를 선택합니다.

  3. 필터 목록에서 [Public images] 등의 이미지 유형을 선택합니다. 검색 창에서 [Platform]을 선택하고 [Amazon Linux] 등의 운영 체제를 선택한 후 [Root Device Type]을 선택하고 [Instance store]를 선택합니다.

  4. (선택 사항) 결정에 도움이 되는 추가 정보를 얻으려면 [Show/Hide Columns] 아이콘을 선택하고, 표시할 열을 업데이트한 후 [Close]를 선택합니다.

  5. AMI를 선택하고 AMI ID를 메모해 둡니다.

명령줄을 사용하여 AMI의 루트 디바이스 볼륨 유형을 확인하려면 다음을 수행합니다.

다음 명령 중 하나를 사용할 수 있습니다. 다음의 명령줄 인터페이스에 대한 자세한 내용은 Amazon EC2에 액세스 단원을 참조하십시오.

인스턴스의 루트 디바이스 유형 확인

콘솔을 사용하여 인스턴스의 루트 디바이스 유형을 확인하려면 다음을 수행합니다.

  1. Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 [Instances]를 선택하고 인스턴스를 선택합니다.

  3. 아래를 참고하여 [Description] 탭의 [Root device type] 값을 확인합니다.

    • 값이 ebs이면 Amazon EBS 지원 인스턴스입니다.

    • 값이 instance store이면 인스턴스 스토어 지원 인스턴스입니다.

명령줄을 사용해 인스턴스의 루트 디바이스 유형을 확인하는 방법

다음 명령 중 하나를 사용할 수 있습니다. 명령줄 인터페이스에 대한 자세한 내용은 Amazon EC2에 액세스 단원을 참조하십시오.

루트 디바이스 볼륨이 계속 유지되도록 변경

기본적으로 Amazon EBS에서 지원하는 AMI의 루트 디바이스 볼륨은 인스턴스 종료 시 삭제됩니다. 기본 동작을 변경하려면 블록 디바이스 매핑을 사용하여 DeleteOnTermination 속성을 false로 설정합니다.

콘솔을 사용하여 루트 볼륨이 계속 유지되도록 변경

콘솔을 사용하여 인스턴스 시작 시 DeleteOnTermination 속성을 변경할 수 있습니다. 실행 중인 인스턴스의 속성을 변경하려면 명령줄을 사용해야 합니다.

콘솔을 사용해 인스턴스의 루트 디바이스 볼륨 유지를 설정하는 방법(인스턴스 시작 시)

  1. Amazon EC2 콘솔을 엽니다.

  2. Amazon EC2 콘솔 대시보드에서 [Launch Instance]를 선택합니다.

  3. [Choose an Amazon Machine Image (AMI)] 페이지에서 사용할 AMI를 선택하고 [Select]를 선택합니다.

  4. 마법사 안내에 따라 [Choose an Instance Type] 및 [Configure Instance Details] 설정을 완료합니다.

  5. [Add Storage] 페이지에서 루트 볼륨에 대한 [Delete On Termination]의 선택을 해제합니다.

  6. 나머지 마법사 페이지를 완료한 다음 [Launch]를 선택합니다.

인스턴스의 세부 정보 창에서 루트 디바이스 볼륨의 세부 정보를 조회하여 설정을 확인할 수 있습니다. [Block devices] 옆의 루트 디바이스 볼륨 항목을 선택합니다. [Delete on termination]의 기본 설정은 True입니다. 기본 동작을 변경하면 [Delete on termination]이 False가 됩니다.

AWS CLI를 사용하여 인스턴스의 루트 볼륨이 계속 유지되도록 변경

AWS CLI를 사용하여 인스턴스 시작 시 또는 인스턴스 실행 중에 DeleteOnTermination 속성을 변경할 수 있습니다.

예 시작 시

루트 볼륨을 보존하려면 run-instances 명령을 사용하여 DeleteOnTermination 속성을 false로 설정하는 블록 디바이스 매핑을 포함시킵니다.

aws ec2 run-instances --block-device-mappings file://mapping.json other parameters...

mapping.json에서 다음을 지정합니다.

[ { "DeviceName": "/dev/sda1", "Ebs": { "DeleteOnTermination": false } } ]

아래와 같이 describe-instances 명령을 사용하고 명령 출력에서 디바이스의 BlockDeviceMappings항목을 찾아보면 DeleteOnTermination이 false인 것을 확인할 수 있습니다.

... "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "Status": "attached", "DeleteOnTermination": false, "VolumeId": "vol-1234567890abcdef0", "AttachTime": "2013-07-19T02:42:39.000Z" } } ...

예 인스턴스 실행 중

루트 볼륨을 보존하려면 modify-instance-attribute 명령을 사용하여 DeleteOnTermination 속성을 false로 설정하는 블록 디바이스 매핑을 포함시킵니다.

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --block-device-mappings file://mapping.json

mapping.json에서 다음을 지정합니다.

[ { "DeviceName": "/dev/sda1", "Ebs" : { "DeleteOnTermination": false } } ]


+ Recent posts