元ネタ
AWSのWell-Architected Frameworkを改めて整理。せっかくなんでハンズオン形式で学べるAWS Well-Architected Labsをやってみよう!ということで、備忘も兼ねて実践&記録をしてみました。
前提条件
- AWSアカウントがあること
- IAM でリソースを作成する権限。
ハンズオン開始
0. 概要
このハンズオンでは、EC2作成の際に決められたタグを強制するIAMロールを作成します。
1. ec2-list-readポリシーの作成
EC2に対する、リージョン条件付きの読み取り専用のアクセス許可を持つポリシーを作成します。
ポリシー作成手順
- IAMコンソールを開く。
- 「ポリシー」より「ポリシーの作成」を選択する。
- 「ポリシーエディタ」より「JSON」タブを選択する。
- 以下のポリシーを貼り付ける。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ec2listread",
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:Get*"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:RequestedRegion": [
"us-east-1",
"us-west-1"
]
}
}
}
]
}
- 「次へ」を選択する。
- 「ポリシーの詳細」の「ポリシー名」に「ec2-list-read」を入力し、「ポリシーの作成」を選択する。
2. ec2-create-tagsポリシーの作成
アクション条件がRunInstancesであるEC2のタグの作成が許可されるポリシーを作成します。
ポリシーの作成手順
- IAMコンソールを開く。
- 「ポリシー」より「ポリシーの作成」を選択する。
- 「ポリシーエディタ」より「JSON」タブを選択する。
- 以下のポリシーを貼り付ける。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ec2createtags",
"Effect": "Allow",
"Action": "ec2:CreateTags",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:CreateAction": "RunInstances"
}
}
}
]
}
- 「次へ」を選択する。
- 「ポリシーの詳細」の「ポリシー名」に「ec2-create-tags」を入力し、「ポリシーの作成」を選択する。
3. ec2-create-tags-existingポリシーの作成
リソースにすでにTeam / Alphaのタグが付いている場合にのみ、EC2 タグの作成 (および上書き) が許可されるポリシーを作成します。
ポリシーの作成手順
- IAMコンソールを開く。
- 「ポリシー」より「ポリシーの作成」を選択する。
- 「ポリシーエディタ」より「JSON」タブを選択する。
- 以下のポリシーを貼り付ける。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ec2createtagsexisting",
"Effect": "Allow",
"Action": "ec2:CreateTags",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Team": "Alpha"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"Team",
"Name"
]
},
"StringEqualsIfExists": {
"aws:RequestTag/Team": "Alpha"
}
}
}
]
}
- 「次へ」を選択する。
- 「ポリシーの詳細」の「ポリシー名」に「ec2-create-tags-existing」を入力し、「ポリシーの作成」を選択する。
4. ec2-run-instancesポリシーの作成
このポリシーの最初のセクションでは、リージョンと特定のタグ キーの条件が一致する場合にのみ、インスタンスの起動が許可されます。2 番目のセクションでは、インスタンスの起動時にリージョン条件を使用して他のリソースを作成できるようにします。
ポリシーの作成手順
- IAMコンソールを開く。
- 「ポリシー」より「ポリシーの作成」を選択する。
- 「ポリシーエディタ」より「JSON」タブを選択する。
- 以下のポリシーを貼り付ける。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ec2runinstances",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringEquals": {
"aws:RequestedRegion": [
"us-east-1",
"us-west-1"
],
"aws:RequestTag/Team": "Alpha"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"Name",
"Team"
]
}
}
},
{
"Sid": "ec2runinstancesother",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:ec2:*:*:subnet/*",
"arn:aws:ec2:*:*:key-pair/*",
"arn:aws:ec2:*::snapshot/*",
"arn:aws:ec2:*:*:launch-template/*",
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*:*:security-group/*",
"arn:aws:ec2:*:*:placement-group/*",
"arn:aws:ec2:*:*:network-interface/*",
"arn:aws:ec2:*::image/*"
],
"Condition": {
"StringEquals": {
"aws:RequestedRegion": [
"us-east-1",
"us-west-1"
]
}
}
}
]
}
- 「次へ」を選択する。
- 「ポリシーの詳細」の「ポリシー名」に「ec2-run-instances」を入力し、「ポリシーの作成」を選択する。
5. ec2-manage-instancesポリシーの作成
TeamがAlphaでリージョンであるという条件で、インスタンスの再起動、終了、開始、停止が許可されるポリシーを作成します。
ポリシーの作成手順
- IAMコンソールを開く。
- 「ポリシー」より「ポリシーの作成」を選択する。
- 「ポリシーエディタ」より「JSON」タブを選択する。
- 以下のポリシーを貼り付ける。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ec2manageinstances",
"Effect": "Allow",
"Action": [
"ec2:RebootInstances",
"ec2:TerminateInstances",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Team": "Alpha",
"aws:RequestedRegion": [
"us-east-1",
"us-west-1"
]
}
}
}
]
}
- 「次へ」を選択する。
- 「ポリシーの詳細」の「ポリシー名」に「ec2-manage-instances」を入力し、「ポリシーの作成」を選択する。
6. ロールの作成
これまで作成したポリシーを適用したロールを作成します。
ロールの作成手順
- IAMコンソールを開く。
- 「ロール」より「ロールの作成」を選択する。
- 「信頼されたエンティティタイプ」より「AWSアカウント」を、「AWSアカウント」より「別のアカウント」を選択し、「アカウントID」を入力し、ベストプラクティスのために「MFAが必要」にチェックを入れ、「次へ」を選択する。
- 「許可ポリシー」の検索ボックスに「ec2-」を入力し、表示された5つのポリシーの横にあるチェックボックスをオンにします。
- 「次へ」を選択する。
- 「ロールの詳細」の「ロール名」に「ec2-admin-team-alpha」を入力し、「ロールの作成」を選択する。
7. ロールの切り替え
テスト確認のために、6. で作成したロールに切り替えます。
ロールの切り替え手順
- 「ロール」より6.で作成したロール「ec2-admin-team-alpha」の詳細を開く。
- 「概要」に右端にある「コンソールでロールを切り替えるためのリンク」のリンクをコピーする。
- ブラウザのURLに貼り付ける。
- 「ロールの切り替え」にて、「アカウント」がアカウントID、「ロール」が「ec2-admin-team-alpha」であることを確認し、必要に応じて「表示名」「色」を変更し、「ロールの切り替え」を選択する。
- 右上のナビゲーションバーの名前が4.で入力された表示名になっていることを確認する。
8. リージョン及びタグの確認
制限されたリージョンとタグを確認します。
確認手順
- 右上のナビゲーションバーでロールが変わっていることを確認する。
- リージョンをap-northeast-1に変更し、EC2コンソールを開く。
- 「リソース」のほとんどがAPIエラーになっていることを確認する。
- リージョンをus-east-1を選択し、「ロードバランサー」「Auto Scalingグループ」のみがAPIエラーになっていることを確認する。
- 「インスタンスを起動」を選択する。
- 「名前とタグ」に間違ったタグを入力する。例えば「キー」に「Team」、「値」に「Beta」と入力する。
- 「Application and OS Images」では「Amazon Linux」の無料枠を、「インスタンスタイプ」では「t2.micro」、「キーペア(ログイン)」では「キーペアなしで続行(推奨されません)」、「ネットワークの設定」では「既存のセキュリティグループ」を選択した上で「共通のセキュリティグループ」に「default」を選択する。「ストレージを設定」は変更なし。
- 「インスタンスを起動」を選択するとエラー表示されることを確認する。
- 「インスタンス構成の編集」を選択し、「名前とタグ」で入力したキー「Team」の値に「Alpha」と入力する。
- 「インスタンスを起動」を選択すると成功することを確認する。
9. タグの変更
間違ったタグに変更した場合もエラーになることを確認します。
確認手順
- 8.で作成したEC2インスタンスの詳細を開く。
- 「タグ」タブを開き、「タグを管理」を選択する。
- キー「Team」の値を「Test」に更新し、「保存」を選択するとエラー表示されることを確認する。
- キー「Team」の値を「Alpha」に更新し、「保存」を選択すると成功することを確認する。
10. インスタンスの終了
作成したEC2インスタンスを終了します。
終了手順
- EC2インスタンス一覧より8.で作成したEC2インスタンスの横のチェックボックスをオンにする。
- 上部にある「インスタンスの状態」より「インスタンスを終了」を選択する。
- 「終了インスタンス?」よりインスタンスIDを確認し、「終了」を選択する。
- しばらくしてEC2インスタンス一覧の対象EC2インスタンスが「終了済み」になっていることを確認する。
不要になったインスタンスは削除できます。これは、インスタンスの終了 と呼ばれます。インスタンスの状態が shutting-down
または terminated
に変わったら、そのインスタンスへの課金は停止します。
インスタンスを削除した後に、接続または起動することはできません。ただし、同じ AMI から別のインスタンスを起動することができます。
インスタンスの削除後、インスタンスはしばらくの間コンソールに表示されたままですが、エントリは自動的に削除されます。終了したインスタンスのエントリを自分で削除することはできません。インスタンスを削除すると、タグやボリュームなどのリソースはインスタンスから徐々に関連付けが解除され、しばらくすると削除されたインスタンスでこれらのリソースが表示されなくなる可能性があります。
インスタンスが終了すると、そのインスタンスに関連付けられたすべてのインスタンスストアボリュームのデータが削除されます。
デフォルトでは、インスタンスの削除時に Amazon EBS のルートデバイスボリュームが自動的に削除されます。ただし、起動時にアタッチした追加の EBS ボリューム、または既存のインスタンスにアタッチした EBS ボリュームがある場合、デフォルトでは、インスタンスの削除後もそれらのボリュームは保持されます。この動作はボリュームの DeleteOnTermination
属性によって制御されますが、変更できます。