ablog

不器用で落着きのない技術者のメモ

「AWS 認定ビッグデータ – 専門知識」試験の準備方法

AWS 認定ビッグデータ – 専門知識(AWS Certified Big Data - Specialty)」の試験を受けるにあたっての勉強の仕方をメモ。AWS 認定 – 認定の準備に書かれている通りだが、Linux Academy の模擬試験が効果的だった。

準備方法

VPCエンドポイントポリシーのサイズ上限

VPC エンドポイント ポリシーの使用
VPC エンドポイントポリシーは、エンドポイントの作成時または変更時にエンドポイントにアタッチする IAM リソースポリシーです。エンドポイントの作成時にポリシーをアタッチしない場合、サービスへのフルアクセスを許可するデフォルトのポリシーがアタッチされます。エンドポイントポリシーは、IAM ユーザーポリシーやサービス固有のポリシー (S3 バケットポリシーなど) を上書き、または置き換えません。これは、エンドポイントから指定されたサービスへのアクセスを制御するための別のポリシーです。
(中略)
エンドポイントポリシーのサイズが 20,480 文字を超えることはできません (空白を含む)。

VPC エンドポイント によるサービスのアクセスコントロール - Amazon Virtual Private Cloud

Organization ID を利用してS3のクロスアカウントアクセスを許可する。

課題

S3 のバケットポリシーでクロスアカウントアクセスを許可する場合、Principal に指定するAWSアカウントIDの数が多くなると、バケットポリシーのサイズの上限に達してしまう。

解決策

{
    "Version": "2012-10-17",
    "Id": "Policy1543071477610",
    "Statement": [
        {
            "Sid": "AllowGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::orgid-test-bucket",
                "arn:aws:s3:::orgid-test-bucket/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": [
                        "o-xxxxxxxxxx",
                        "o-yyyyyyyyyy",
                        "o-zzzzzzzzzz"
                    ]
                }
            }
        }
    ]
}
  • Organization ID はマスターアカウントで マネジメントコンソールにログインして、子アカウントを選択して[設定]をクリックして確認する。

CloudTrail で CloudWatch Logs に配信しようとすると「ロールポリシーを検証できません」と怒られる

事象

  • CloudTrail で CloudWatch Logs に配信しようとすると「ロールポリシーを検証できません」と怒られる

再現手順

  • AWSマネジメントコンソールで[CloudTrail]-[証跡情報]から任意の Trail を選択する。
  • CloudWatch Logs で「次へ」をクリックする。

  • 新しいロールの作成を選択し、「許可」をクリックする。

解決策

  • 再度同じ手順で作成し、先程の手順で作成されたiAMロールとポリシー名を選択する。

  • 無事成功。

cfnで作成したバケットポリシーを変更後にcfnで元に戻す

S3バケット作成とバケットポリシー設定を CloudFormation で行った後に、手動でバケットポリシーを変更し、CloudFormation で元に戻してみた。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<AWSアカウントID>:root",
                    "arn:aws:iam::<AWSアカウントID>:root",
                    "arn:aws:iam::<AWSアカウントID>:root",
                    "arn:aws:iam::<AWSアカウントID>:root"
                ]
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::az-test-20190318-6",
                "arn:aws:s3:::az-test-20190318-6/*"
            ]
        }
    ]
}
  • 手動で以下の CloudFormation テンプレートを実行し、バケットポリシーを元に戻す。
AWSTemplateFormatVersion: '2010-09-09'
Description: This CloudFormation template to create S3 Bucket
 
Parameters:
  S3BucketName:
    Description: Type of this BacketName.
    Type: String
 
Resources:
  S3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties: 
      Bucket: !Sub ${S3BucketName}
      PolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - 
            Action: 
              - "s3:GetObject"
            Effect: "Allow"
            Resource: 
              Fn::Join: 
                - ""
                - 
                  - "arn:aws:s3:::"
                  - 
                    !Sub ${S3BucketName}
                  - "/*"
            Principal: 
              AWS:
                Fn::Join:
                  - ""
                  - 
                    - "arn:aws:iam::"
                    - Ref: "AWS::AccountId"
                    - ":root"

Outputs:
  S3BucketName:
    Value: !Sub ${S3BucketName}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWSアカウントID>:root"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::az-test-20190318-6/*"
        }
    ]
}

CloudFormationでS3バケットを作成してバケットポリシーを設定する

CloudFormationでS3バケットを作成してバケットポリシーを設定してみたメモ。

手順

  • CreateS3Bucket.yml をローカルに作成する。
AWSTemplateFormatVersion: '2010-09-09'
Description: This CloudFormation template to create S3 Bucket
 
Parameters:
  S3BucketName:
    Description: Type of this BacketName.
    Type: String
 
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${S3BucketName}
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
  S3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties: 
      Bucket: 
        Ref: "S3Bucket"
      PolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - 
            Action: 
              - "s3:GetObject"
            Effect: "Allow"
            Resource: 
              Fn::Join: 
                - ""
                - 
                  - "arn:aws:s3:::"
                  - 
                    Ref: "S3Bucket"
                  - "/*"
            Principal: 
              AWS:
                Fn::Join:
                  - ""
                  - 
                    - "arn:aws:iam::"
                    - Ref: "AWS::AccountId"
                    - ":root"

Outputs:
  S3BucketName:
    Value: !Ref S3Bucket
  • AWSマネジメントコンソール-[CloudFormation]-[スタックの作成]をクリック

  • テンプレートの選択: [テンプレートを Amazon S3 にアップロード] を選択
  • ファイルの選択でローカルの"CreateS3Bucket.yml"を選択
  • スタックの名前: 任意の名前を入力
  • S3BucketName: S3バケット名を入力

結果

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWSアカウントID>:root"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::az-test-20190318-6/*"
        }
    ]
}

RHEL7 から EFS をマウントする

  • インストールと設定
$ sudo yum -y install git
$ git clone https://github.com/aws/efs-utils
$ cd efs-utils
$ sudo yum -y install rpm-build
$ make rpm
$ sudo yum -y install build/amazon-efs-utils*rpm
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ pip install virtualenv
$ sudo pip install virtualenv
$ virtualenv ~/.envs/efs-utils
$ source ~/.envs/efs-utils/bin/activate
$ pip install -r requirements.txt
$ make test
  • EFSをマウントする
$ mkdir efs
$ sudo mount -t efs fs-f92798d8:/ efs
  • 確認する
$ df -h
Filesystem                                      Size  Used Avail Use% Mounted on
/dev/xvda2                                       10G  1.4G  8.7G  14% /
devtmpfs                                        3.8G     0  3.8G   0% /dev
tmpfs                                           3.9G     0  3.9G   0% /dev/shm
tmpfs                                           3.9G   17M  3.9G   1% /run
tmpfs                                           3.9G     0  3.9G   0% /sys/fs/cgroup
fs-f92798d8.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /home/ec2-user/efs-utils/efs
tmpfs                                           782M     0  782M   0% /run/user/1000