Vapor Trail

明るく楽しく元気よく

手を動かしながら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ロールを利用できないか考える アクセスキー・シークレットキーが流出する危険性を減らす。

FuelPHPのvalidationでそれぞれ個別にメッセージを出したい

FuelPHPのvalidationのadd_ruleでそれぞれ個別にメッセージを出したい。

/lang/jp/validation.php
<?php
return array(
        'required'         => '『:label』は必須です',
        'min_length'       => '『:label』は:param:1文字以上で入力してください',
        'max_length'       => '『:label』は:param:1文字以内で入力してください',
        'exact_length'     => '『:label』は:param:1文字で入力してください',
        'match_value'      => '『:label』は『:param:1』と一致していません',
        'match_pattern'    => '『:label』は『英数字と記号(@+-.)のみ』で入力する必要があります',
        'match_field'      => '『:label』は『:param:1』と一致していません',
        'valid_email'      => '『:label』が不正です',
        'valid_emails'     => '『:label』に不正なメールアドレスが含まれてます',
        'valid_url'        => '『:label』は不正なURLです',
        'valid_ip'         => '『:label』は不正なIPアドレスです',
        'numeric_min'      => '『:label』は:param:1以上で入力してください',
        'numeric_max'      => '『:label』は:param:1以内で入力してください',
        'valid_string'     => '『:label』は『英数字と記号(@+-.)のみ』で入力する必要があります',
        'checkbox_require' => '『:label』は:param:1つ以上選択する必要があります',
        'unique' => '『:label』はすでに登録してあります。',
        'uniquemail' => '『:label』はすでに登録してあります。',
        'phone_number' => '『:label』は『数字とハイフン』で入力する必要があります'
);        

valid_stringのルールのエラーメッセージを一応設定はできる。

<?php
        $form->add('zip_code', '郵便番号', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule('valid_string','numeric');

例えばこの場合、郵便番号のフォームで数字のみのルールにしても、valid_stringのルールのエラーメッセージの設定値として '『郵便番号』は『英数字と記号(@+-.)のみ』で入力する必要があります'と表示されてしまう。

しかし、入力フォームが複数あって、それぞれのフォームに細かなルールを設定して別々のエラーメッセージを表示したい場合に困る。

<?php
        // 郵便番号は数字のみ
        $form->add('zip_code', '郵便番号', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule('valid_string','numeric');
        // アクセスキーは英数字のみ
        $form->add('access_key', 'アクセスキー', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule('valid_string','alphanumeric');
$form->validation()->set_message('valid_string', '数字のみで入力する必要があります');

とすることもできるが、valid_stringのルールに対して1つしかメッセージを設定できない。
この場合、アクセスキーのフォームのエラーメッセージは'英数字のみで入力する必要があります'と表示したいが'数字のみで入力する必要があります'となる。

qiita.com

<?php
        $form->add('zip_code', '郵便番号', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule(['zip_code' => function ($zip) {
                return (bool)preg_match('/^[0-9]+$/', $zip);
            }]);
$form->validation()->set_message('zip_code', '郵便番号は数字のみで入力する必要があります');

個別にルールをクロージャで設定すると、細かなバリデーションエラーのメッセージを表示することができる。

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

Day8 Route53を使ってドメインを登録する

https://aws.amazon.com/jp/route53/what-is-dns/

DNSレコードタイプ A:
ホスト名とIPアドレスを紐付ける
www.host-name.com. IN A 192.168.0.1

CNAME:
ドメインを別のドメインに置き換える
www.host-name.com. IN CNAME host-name.amazonses.com.

NS:
ゾーンに対する権威を持つ権威DNSサーバーを指定する
www.host-name.com. IN NS ns.host-name.com.

Route53について

  • DNSの機能を簡単に利用できる
  • SLAが100%
  • 多様なルーティングポリシー

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy.html

単純なルーティングの設定

Route53→DNS management→CreatdHostZone
Domain Name:取得しているドメイン
Type:PublicHostedZone
Create

EC2のWeb-1aを起動しておく

CreateRecordSet
Name: 空
Type:IPv4 Alias:Yes
ELB Application load balancersを設定
Routing Policy:Simple
Evaluate Target Health:No

NSを登録する 反映されるまで待つ

nslookup ドメイン

ELBにアクセスして失敗した場合に、S3のエラーページにルーティングするようにする

https://recipe.kc-cloud.jp/archives/3450

  • フェイルオーバーの設定

Route53→CreateRecordSet
Type:AレコードのRoutingPolicyをFailOver
EvaluateTargetHealth:Yes
Save

CreateRecordSet
Name:空
Type:A
Alias:S3 website endpoints
RoutingPolicy:FailOver
FailoverRecordType:Secondary
ELBがFailした場合にS3にルーティングする

EC2のapacheを止める
EC2のターゲットグループがunhealtyになっていることを確認
ドメイン名にアクセスすると、S3の静的ページにルーティングされる