やーまんぶろぐ

気が向いた時にだけ書くブログ

AWS 認定プログラムについて メモ

AWSの認定プログラムについてメモしておきます。
aws.amazon.com

公式でSlideShareに情報がまとめられています。

www.slideshare.net

種類、試験料、勉強方法についてメモしておきます。

種類

現在、Specialtyの資格が増えて全部で7個の資格が存在します。

  • Associate
    • Solution Architect
    • Developer
    • SysOps Administrator
  • Professional
    • Solution Architect
    • DevOps Engineer
  • Specialty
    • Advanced Networking
    • Big Data

料金

  • Associateレベル試験
    • 16200円
  • Professionalレベル試験
    • 32400円
  • 模擬試験(各資格ごとにある)
    • 一律2160円
  • 再認定試験(2年ごとに再認定が必要)
    • 一律8100円

全部受けるとかなり高いです。Professionalを受けるにはそれに対応するAssociateの資格が必要です。
f:id:yamano3201:20171130162013p:plain
ex) DeveloperかSysOps Administratorを持っていれば、DevOps Engineerを受けることが可能

またProfessionalを取得すると、Associateの再認定が不要になるので2年経過する直前にProffessionalを取得するとお得かもしれません。

Solution ArchitectとDevOps Engineerは別々の再認定が必要になります。

勉強法

ある程度AWSを触ったことがある方を前提に書いています。

1. 無料問題集
数は少ないですが、まずは無料の問題集を探してみます。
yamano3201.hatenablog.jp

2. 模擬試験
続いて模擬試験を受けます。問題になれるという意味では一番効果があると思います。
いくつかのパターンからランダムで出題されるようで、同じ問題にあたる可能性があるので1度で充分でしょう。
分野ごとの点数は出ますが、どの問題を間違ったのか、どれが正解なのかはわからないので、必ずコピペして後で復習しておきましょう。

3. 対策本
そして合格対策 AWS認定ソリューションアーキテクト - アソシエイトを購入しましょう。

合格対策 AWS認定ソリューションアーキテクト - アソシエイト

合格対策 AWS認定ソリューションアーキテクト - アソシエイト

探してもこれしかなかった。模擬試験だけで自信がない方は購入すると良いでしょう。

Associateならここまでで充分だと思います。

4. Proffesional対策
Proffesionalの問題がなかなか見つからなかったのですが、UdemyとLinux AcademyにProffesionalの問題が存在しました。有料で英語しかなかったのですが試験を受ける前に目を通すとよいかもしれません。
www.udemy.com
linuxacademy.com

Linnux Academyには7日間の無料トライアルがあるので、こちらを試してみました。
動画の説明資料だけではなく、解答つきの問題があるのでとても便利でした。

おまけ. QuickLabs
QuickLabsにも試験対策があります。
qwiklabs.com

こちらは問題形式ではなく、実際にAWSを触る演習になります。
演習に参加するにはお金がかかりますが、実際に手を動かす環境は一時的なアカウントが発行されて無料で使用できるようになっています。

手を動かせる環境がない場合はこちらを使うのも有効でしょう。今度やってみるか迷い中です。

最後に

私はSolution ArchitectとSysOps AdministratorのAssociateを持っています。
出題範囲が被っていたので、1度の勉強で2つとも取得することができました。

近いうちにSolution ArchitectのProffesionalも受けようと考えています。

Udemy Cyber Monday セール ほとんど1200円

1万円から2万円ほどするオンライン学習動画が1200円で購入できるということで、普段勉強しないような分野から3つ購入しました。

セキュリティの分野から1つ。
www.udemy.com

趣味でしか触ってないフロントエンドの勉強も兼ねて1つ。
www.udemy.com

勉強しようと思っていたけどなかなか手が出せていなかったReactで1つ。
www.udemy.com

他にも無料のものもあったのでAWS関連で2つ。
www.udemy.com

www.udemy.com

中身はまだ見てません。

セールは11/28までなのでお早めに。

CloudFormationでクロススタック参照

まずCloudFormationを勉強したい場合は、「CloudFormation Getting Started with YAML」を読みましょう。とても参考になりました。

www.slideshare.net

後半ではWeb3階層アーキテクチャのテンプレート分割例が記載されています。

テンプレート自体は記載されていなかったので、これを参考にWeb3階層アーキテクチャのテンプレートをクロススタック参照で以下のテンプレートに分割して作成してみました。

  • vpc.template
  • bastion.template
  • app.template
  • db.template
  • lb.template
  • sg.template
  • route53.template

ここではvpc.templateでExportして、bastion.templateでImportするという例でメモしておきたいと思います。

Exportの仕方

vpc.templateでは、VPCやSubnetなど後続のテンプレートで呼び出したい値をOutputsでExportしておきます。

Export Nameは固定値でも良いのですが、同じリージョンで複数作成することを考慮すると変数などを付けてバッティングを避けたほうが良さそうです。

ここではStackNameという事前に定義されている擬似パラメーターを使用することにしました。擬似パラメーター参照 - AWS CloudFormation

!Subという組み込み関数を使用することで変数を展開しています。Fn::Sub - AWS CloudFormation

Outputs:
  VPC:
    Value:
      Ref: VPC
    Export:
      Name: !Sub "${AWS::StackName}-VPC" # 展開するとvpc-stack0-VPC

CloudFormation実行時のスタック名をvpc-stack0として実行したので、vpc-stack0-VPCという名前がExportされました。

Importの仕方

次にbastion.templateをbastion-stack0というスタック名で実行します。
さきほどのVPCの値をImportするときに、vpc-stack0という名前を教えなくてはなりません。

ここではParametersを使って、実行時に値を直接入力することにしてます。VPCStackNameというパラメータを定義し、デフォルトではvpc-stack0が返るようにしています。
Parameters - AWS CloudFormation

あとは値を呼び出したいところでImportします。Exportした値と同じ値を指定すれば呼び出し可能です。

Parameters:
  VPCStackName:
    Type: String
    Default: vpc-stack0
Resources:
  BastionSG: 
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      VpcId:
        Fn::ImportValue: !Sub ${VPCStackName}-VPC # 展開するとvpc-stack0-VPC

デフォルト値を使用した場合は展開するとvpc-stack0-VPCをImportすることになります。

最後に

整理したら全てのテンプレートを公開したいですね。

CloudFormationでEC2用のIAMロールを作成するときはインスタンスプロファイルに注意する

EC2からAWSのリソースにアクセスする必要がある場合は、アクセスキーではなくIAMロールを使ってアクセスしましょう。

以下にコンソールからIAMロールを作成する方法が記載されています。
qiita.com

IAMロール作成の流れ

コンソールから作成すると、以下の流れに見えます。

  • IAMロール作成
  • IAMポリシーを選択
  • EC2作成時にIAMロールを指定

細かいけどこれは間違いで、実際には以下の流れが正しいです。

  • IAMロール作成
  • IAMポリシーを選択
  • インスタンスプロファイルを作成してIAMロールと紐づける
  • EC2作成時にインスタンスプロファイルを指定

インスタンスプロファイルはEC2にIAMロールを紐づけるために必要なものになります。

コンソールから作成するとIAMロールと同名のインスタンスプロファイルが作成されるので、EC2作成時にはIAMロールを指定しているように見えるのでしょう。

CloudFormationで作成する場合にはインスタンスプロファイルを作成することに注意しましょう。これを忘れるとIAMロールを作成していたとしても、EC2起動時にIAMロールと紐づけることができません。

CloudFormationサンプル

  • IAMロール作成
BastionIAMRole:
  Type: "AWS::IAM::Role"
  Properties:
    AssumeRolePolicyDocument:
      Statement: 
        -
          Effect: "Allow"
          Principal:
            Service:
              - "ec2.amazonaws.com"
          Action:
            - "sts:AssumeRole"
      Path: "/"
  • IAMポリシーを選択
    • Actionに必要な権限を記載しましょう。
BastionIAMPolicy:
  Type: "AWS::IAM::Policy"
  Properties:
    PolicyName: BastionIAMPolicy
    Roles:
      - Ref: BastionIAMRole
    PolicyDocument:
      Statement:
        -
          Effect: "Allow"
          Resource: ""
          Action:
          - "ec2:*"
  • インスタンスプロファイルを作成してIAMロールと紐づける
    • Roleには上で記載したIAMロールを指定します
BastionIAMInstanceProfile:
  Type: "AWS::IAM::InstanceProfile"
  Properties:
    Path: "/"
    Roles:
      - Ref: BastionIAMRole
  • EC2作成時にインスタンスプロファイルを指定
    • IamInstanceProfile以外のプロパティは省略しています
    • ここで紐付けているのがIAMロールじゃなくてインスタンスプロファイルだということに注意しましょう。
BastionEC2:
  Type: "AWS::EC2::Instance"
  Properties:
    IamInstanceProfile:
      Ref: BastionIAMInstanceProfile

CloudFormerを使ってAWS CloudFormationのテンプレートを自動作成する

CloudFormerとは自分で構築したAWSリソースから、AWS CloudFormationのテンプレートを自動作成してくれるツールになります。

自動で作成とは言ってもそのまま使いまわせるわけではないので注意が必要です。

また、EC2上にCloudFormerを構築してブラウザアクセスして使用するというところが、他のAWSのサービスとは違うところだと感じました。

EC2上にCloudFormerを構築する

まずはEC2上に構築します。公式で用意されているCloudFormationのサンプルテンプレートがあるのでそれを実行しましょう。
以下のリンクを見ながら作業しました。
kaotil.com

後でログインする時に使うユーザ名/パスワードを入力しておきます。

CloudFormerにブラウザアクセスする

CloudFormation実行が成功するとOutputsにURLが表示されるのでアクセスします。
構築時に指定したユーザ名/パスワードを入力してログインします。

念のためこの時点でSecurityGroupをコンンソールから触ってアクセスを制限しておきました。

リソースを選択してテンプレートを作成する

続いてテンプレート化したいリソースにアクセスしていきます。

以下の大項目から選択します。

  • DNS
  • VPC
  • VPC Network
  • VPC Security
  • Network
  • Managed Service
  • Managed Config
  • Compute
  • Storage
  • Storage Config
  • App Service
  • Security
  • Operational

以下のリンクにAWS CloudFormer がサポートしているリソース一覧がまとまっているので、こちらを参考にテンプレートにしたいリソースを選択していきましょう。
qiita.com

選択するとすぐにテンプレートが作成されます。
EC2の料金がかかってしますので、不要になったCloudFormerのCloudFormationスタックは削除しておきましょう。

JSONYAMLに変換する

JSONでの出力にしか対応していません。YAMLにしたい場合は別のツールで変換が必要です。

私は以下のリンクで変換を行いました。
phiary.me

注意する点

一回でうまくいくものではないので何回かトライ&エラーで頑張るしかないです。困ったらリファレンスを見ましょう。
docs.aws.amazon.com

以下に個人的に感じた注意点をまとめておきます。

  • subnetxxxxxxxxのように各種IDがそのまま出力される
    • PublicSubnetAのように汎用的な名前に変換する
  • PublicSubnetB, PrivateSubnetA, PrivateSubnetB, PublicSubnetAのように順番が綺麗じゃない
    • 順番を整理する
  • outputsが出力されない
    • 結果を確認したい値があるものや他のスタックで参照したいものは出力する
  • 対応していないリソースがある
    • リファレンスを見ながら追加する。CloudWatchLogsみたいにリソースそのものがないものや、AutoScalling::LaunchConfigurationのUSERDATAみたいにリソースはあるけど一部プロパティがないものもあったので注意。
  • アタッチはされているけど、作成されないリソースがある
    • IAM::InstanceProfileとかAWS::EC2::VPCEndpointはアタッチはされているけど、リソースがないのでエラーになってしまいます。事前に作成するかCloudFormationで一緒に作成するかしましょう。

IAMで踏み台サーバのローカルユーザを一元管理を実行してみる

この記事の続きです。
yamano3201.hatenablog.jp

踏み台サーバのCloudFormationテンプレートでは実現できなかった、以下の要件に対応したいと思います。

  • ユーザアカウントごとにログインさせる
  • 可能な限りユーザアカウントの管理を減らしたい
  • sudo を使わせない

基本的には以下のサイトと同じです。
qiita.com

やってることは踏み台上にIAMユーザと同名のローカルユーザを自動作成して、アカウント管理を減らそうというものになります。
IAMユーザにはSSH公開鍵を登録できるので、それをローカルユーザの.ssh/authorized_keysとしてセットすることでSSHログインも管理できます。

事前準備

  • IAMユーザにsshパブリックキーを登録
  • iam list-users, iam list-ssh-public-keys, iam get-ssh-public-keyの権限を持ったIAMロールを用意(とりあえず前回作成されたIAMロールにIAMReadOnlyAccessポリシーを追加しました)

USER DATAに登録

オートスケールで自動で作成されるたびにスクリプトを流します。
スクリプトはリンク先bashスクリプトとほぼ同じなので割愛します。

USER DATA上でjqをインストールする必要があるのでご注意ください。

sudo yum install -y jq

前回作成したUSER DATAの下に、jqインストールとリンク先スクリプトを追加するとうまく動くと思います。

鍵の更新についても実装していますが、オートスケールによって毎回新規で作成されるので余分なところは削ってもよいかもしれないです。

configurationを作成してアタッチする

オートスケールのconfigurationは編集できないので、新しく作成しましょう。(コピーすると簡単です)
そこでUSER DATAを編集します。

初期ユーザであるec2-userではなく、各ローカルユーザでログインさせたい場合は鍵の登録は不要です。

最後にAutoScallingGroup側で新しいconfigurationをアタッチすれば完成です。

最後に

前回記事と合わせると、以下の要件を合わせた踏み台の作成が完成しました。

  • ログインの証跡を残す
  • 証跡はS3に保存
  • yum updateが定期的に走る
  • オートスケールする(可能であればログインするときだけ起動するようにしたい)
  • ユーザアカウントごとにログインさせる
  • 可能な限りユーザアカウントの管理を減らしたい
  • sudo を使わせない

yamano3201.hatenablog.jp

踏み台サーバのCloudFormationテンプレートを実行してみる

踏み台サーバの要件を洗い出してみたところ、ほとんどが提供されているCloudFormationのテンプレートでカバーできていることがわかったので、まずは実行してみることにしました。

基本的には以下のサイトと同じです。
dev.classmethod.jp

要件

  • テンプレートで実現できていること
    • ログインの証跡を残す
    • 証跡はS3に保存
    • yum updateが定期的に走る
    • オートスケールする(可能であればログインするときだけ起動するようにしたい)
  • テンプレートで実現できていなかったこと
    • ユーザアカウントごとにログインさせる
    • 可能な限りユーザアカウントの管理を減らしたい
    • sudo を使わせない

今回はテンプレートでほとんどの要件を満たしていることを確認しました。
実現できていないことに関しても対策を行ったので別の記事にしたいと思います。

※2017/11/16 追記しました。
yamano3201.hatenablog.jp

実行

リンク先から「Launch Quick Start(for new VPC)」を実行します。遷移先はオレゴンリージョンになってるので構築したいリージョンに変更しましょう。
docs.aws.amazon.com

詳細は以下を入力して実行しました。
f:id:yamano3201:20171115111419p:plain

for existing VPCのほうを実行するとなぜかAutoScallingGroupの作成でタイムアウトになって以下のエラーが出てしまいました。解析はしてないです。

Received 0 SUCCESS signal(s) out of 1. Unable to satisfy 100% MinSuccessfulInstancesPercent requirement

確認

  • ログインの証跡を残す
    • ec2-userでログインして/var/log/bastion/bastion.log を確認するとコマンド履歴が残っていることがわかります
  • 証跡はS3に保存
    • CloudWatchLogsにLinux-bastion-BastionStack-XXXX-BastionMainLogGroup-YYYY というロググループが作成されています。その下にインスタンスID名のLogStreamsが作成されています。オートスケールされるたびに同一のロググループに新しいLogStreamsが作成される形になります。
  • yum updateが定期的に走る
    • cronで実現していました。
$ crontab -l
0 0 * * * yum -y update --security
  • オートスケールする(可能であればログインするときだけ起動するようにしたい)
    • インスタンスを停止させると、インスタンスが削除されて新しいインスタンスが作成されました
    • ログインするときだけ起動すれば充分なので、夕方に削除されるスケジュールアクションを追加しました。

f:id:yamano3201:20171115111129p:plain

まとめ

これでほとんどがOKですね。次回は、テンプレートで実現できなかった部分をまとめたいと思います。

※2017/11/16 追記しました。
yamano3201.hatenablog.jp