手を動かしながら2週間で学ぶ AWS 基本から応用まで Day9

Day9 IAMについて理解を深める

IAMポリシーの作成

参照のみ可能なアプリユーザのポリシーを作成する

IAM→ポリシー→ポリシーの作成
サービス:EC2
[x]リスト
[x]読み込み
書き込み: [x]StartInstances [x]StopInstances
リソース:すべてのリソース

さらにアクセスを許可する
サービス:RDS
[x]リスト
[x]読み込み
リソース:すべてのリソース

ポリシーの確認 名前:App-User-Policy ポリシーの作成

インフラ担当用ユーザのポリシーを作成する
EC2/RDS/IAM フルアクセス・すべてのリソースを許可

IAMユーザの作成

IAM→ユーザ→ユーザを追加
アクセスの種類:AWS マネジメントコンソールへのアクセス

アクセス許可の設定:既存のポリシーを直接アタッチ
ユーザによる管理→App-User-Policy

IAMグループの作成

IAM→グループ→新しいグループの作成
グループ名:App-User-Group
ポリシーのアタッチ:App-User-Policy

グループ名:Infra-User-Group
ポリシーのアタッチ:App-Infra-Policy

グループのアクション→グループにユーザを追加

IAMロールの作成と割当

やりたいこと
バッチサーバ用のポリシー:S3関連のすべてを許可する
バッチサーバ用のポリシーをもつIAMロールの作成
バッチサーバ用のIAMロールを付与されたEC2インスタンスでS3のファイルを取得する

BatchサーバのEC2インスタンスを起動
sshログイン

php src/ListBuckets.php

Adminのアクセスキーとシークレットキーを使用しているので、S3バケット名が取得できる

rm ~/.aws/credentials

クレデンシャルを削除すると権限がないのでS3バケットが取得できなくなる

  • IAMロール用のポリシーの作成
    サービス:S3
    すべてのアクション・すべてのリソースを許可
    Batch-System-Policyの作成

  • IAMロールの作成
    どのリソースにこのロールを割り当てるのかを設定する
    AWSサービス→EC2を選択
    ポリシー:Batch-System-Policy
    Batch-System-Roleとして作成

  • Batch-System-RoleのEC2への紐付け
    EC2→アクション→インスタンスの設定→IAMロールの割当→Batch-System-Roleを選択

<?php
require '../vendor/autoload.php';

use Aws\S3\S3Client;

$s3 = new S3Client([
    //コメントアウトする
    //'profile' => 'default'
    'version' => 'latest',
    'region'  => 'ap-northeast-1'
]);

# バケット一覧の表示
$result = $s3->listBuckets();
foreach ($result['Buckets'] as $bucket) {
    echo $bucket['Name'] . "\n";
}

IAMロールでBatchインスタンスにS3へのアクセス権限を与えたので、クレデンシャルがなくてもS3の一覧が取得できるようになった。

IAMベストプラクティス

  1. 利用者ごとにIAMユーザを作成する
    IAMユーザを使い回すと、CloudTrailでユーザの操作ログをきちんと取れない。誰が何をしたの変わらなくなる。

  2. 役割ごとのIAMグループを作成し、IAMグループに権限を振る
    IAMユーザにポリシーを割り当てると、規模が大きくなると大変になる。間違ったポリシーを割り当てる可能性も出てくる。

  3. 権限は最小限にして、必要になったら増やす

  4. 定期的に権限を見直す

  5. プログラムから利用する場合、アクセスキー・シークレットキーではなくIAMロールを利用できないか考える アクセスキー・シークレットキーが流出する危険性を減らす。