ITの隊長のブログ

ITの隊長のブログです。Pythonを使って仕事しています。最近は機械学習をさわりはじめたお(^ω^ = ^ω^)

aws ソリューションアーキテクト アソシエイトに合格しましたログ

合格した流れのログを残す

試験前の自分のレベル

  • awsは仕事や趣味で使ったことがあるが、ec2、s3、lambda、route53しか使ったことないペーペー
  • インフラの基礎知識はある
    • 3分間ネットワークシリーズを全部読んだ(過去インフラ屋だったとき)
    • それだけじゃないけど、初心者ではないと思う

ログ

勉強期間

3週間ぐらい

勉強に使った書籍とかやったこと

udemyの模擬試験

https://www.udemy.com/course/aws-knan/

これはよかった。最初の模擬試験正解率40%ぐらいで泣きそうになったけど、不正解だった問題をひたすら理解して問題受けて理解してを繰り返したらだいぶ理解できました。

書籍「AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト」

bookwalker.jp

同僚から借りた。↑の模擬試験でわからない理解しづらいところだったり、試験ででてくるサービスの機能を一通り勉強できたのでおすすめだと思います。僕はこれ以外は読んでいない。

実践

cloudformationとか、elasticbeanstalkが全然理解できなかったのでそういうのは実際にさわって勉強しました。おかげでめっちゃ時間食った。。。。。(特にcloudformationはなれるの大変だった

試験の申し込み

dev.classmethod.jp

僕はピアソンVUEで受けました

試験当日

前日が忘年会だったため二日酔い。。。。。

僕の試験会場では免許書と保険証で手続きし、写真とってすぐに試験を受けました。

また、メモ書きできるホワイトボードみたいなものを渡された(帰宅時に回収されます)

試験受けて感じたこと

難しいと思った。

会社のslackにも投稿したけど下記感想

  • vpc,セキュリティグループ結構でる!!!でもそんなに難しいとは思わなかった(同僚と結構勉強してたおかげかと
  • ec2,s3,グレイシア,ebsの提案するコスト削減のタイプとかしっかり覚えておいた方が良い(15問ぐらい出てくる→グレイシアとかどのくらいで読み込みできるかとか覚えておくと良い
  • redshift,kms,kinesisとかは1,2問ぐらい
  • elb結構出た気がする、sslの組み込みとか覚えておいた方が良さそう
  • dbはだいなもとrds,Auroraの基本的な選定理由とリードレプリカだったりアクセラレーションとか押さえておくと良い
  • 知らないサービス、全くわからん問題が出たときは消去法で丁寧に解くとよかった(とても不安になるけど
  • 自動翻訳されているのか日本語へんなので英語でも読むと混乱をさけられるかも。日本語はとにかく読みづらいと感じた
  • 単語が多い問題文、混乱するので図にするとよかった

結果

800点ぐらいで合格しました。思った以上に解けた感じしなかったので心臓バクバクでした。

感想

この業界はいって、資格とったの初めてだ。今度プロフェッショナル取りたい

その他

udemyの模擬試験うけてわからなかった単語・知らんかった機能・サービスメモ

  • MFA認証
    • 二段階認証のこと
    • Multi-Factor Authentication
    • とりあえずCogniteとSESで実現できるとのこと
  • クロスリージョンレプリケーション
  • マルチキャストネットワーキング
  • SES
  • CloudHSM
  • SNS
    • Simple Notification Service
    • メッセージを通知するインフラのサービス(???)
    • メールも遅れるらしいなるほど???
    • Amazon SNS を使用して、SMS 対応デバイスに SMS メッセージを送信できます。 へーー
    • アラーム設定とかはSESは不適切?とのこと
    • Lambdaでもできるけど、SNSのほうが簡単
  • CMK
    • カスタマーマスターキー
  • スケジュールドリザーブインスタンス
    • 日次、週次、月次と3パターンのスケジューリングされた買い方ができます。月一回だけバッチ処理で利用したいなどの要望に利用できます。 へーー
  • スポットインスタンス
    • 停止してる場合は割引される
  • SMS
  • CES
    • Client Side Encryptionはクライアント内で暗合したオブジェクトをS3に登録して、暗号化キーの生成・監理はクライアント側で実行します。
  • SSE-S3
    • Amazon S3 で管理された暗号化キーによるサーバー側の暗号化です。キーに対する個別アクセス制限は不可であり、実質的なアクセス制限は署名バージョン4による当該AWSアカウントID以外の拒否のみができます。暗号化と復号をS3が自動でやってくれるため最も管理の手間がありません。
  • SSE-C
    • Server-Side Encryption with Customer-Provided Encryption Keys (SSE-C)では、暗号化をAWSではなく、ユーザである我々が管理する鍵によって行えるようになりました。これにより、S3上に置かれたコンテンツを、より柔軟に保護できるようになります。
  • aws inspector
  • aws guardduty
  • aws amplify
    • サーバレス構築やUI Component提供 
  • aws AppSync
    • モバイル開発に利用できるAPI(GraphQL or DynamoDB)
  • RDS
    • データを破棄するライフサイクル機能はない
  • Opsworks
    • インフラ管理をメインにした環境設定の仕組み
  • S3
    • 基本暗号化するらしい。ほんで、ダウンロードするときに自動で複合化する
    • KMSでも暗号化できるらしいけども
    • S3のライフサイクルポリシーによってバックアップ取得を定期的にすることはできない
  • EBS
    • スナップショットの定期取得スケジュールでバックアップできる
      • 有効化しただけではライフサイクルは実現できない
    • EBSでRAIDできるのまじか
  • CloudWatch
    • どんなしてログとるのかなとか思っていたけど、エージェントを走らせる必要があるっぽい
  • Aurora
  • VPC
    • vpcフローログ。vpcでログがとれる

cloudformation完全に理解した

タイトル釣りです。

github.com

cloudformation、便利そうだから趣味アプリのデプロイで使うか!って挑戦した結果、やりたいことを実現するのに二週間かかりました。辛い

ハマったこと

  • 既存のリソースがすでに存在する場合 → テンプレートからスタック(リソース群)を作成しようとする段階で落ちます。すでにリソースは存在しているんだ!!で怒られて落ちる。lambdaもs3 bucketも基本的には新規作成で作るのがよさそう
  • 作成するリソース関連でiam周りちゃんと設定しないとスタックが作成できないくて落ちる
  • lambdaのdestinationやら、s3やcloudwatchとの連携周りで結構死んだ。一応できた

  • 新規作成とはいったけど、コードだけデプロイしたい場合はどうすればええんじゃろうか

The role defined for the function cannot be assumed by Lambda. (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: xxx-xxx-xxx-xxx)

cloudformationで無限にこのエラーにハマってて辛かったが解決したのでメモ

stackoverflow.com

cloudformationでデプロイするlambdaに紐付けるロール関連でエラーになっていることはわかったけど、ググってもよくわからなかったが↑の記事試したら解消した

具体的にはロール → 信頼関係 → 信頼関係の編集でPrincipalに "Service": "lambda.amazonaws.com" と入力するだけ

とりあえず解決はしたけどこれはどういうことなんじゃろ。。。引き続き調べる

BigQuery Data Transfer ServiceをAPIから設定する

めっちゃハマった(3H)のでここに記す.

ドキュメントもなく辛い

手順まとめ

モジュールのinstall

$ pip install google-cloud-bigquery-datatransfer

認証ファイル

サービスアカウントでやりました。作成方法はskipします(ぐぐったらすぐ出てくるので)

import os

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './xxx.json'

あと、IAMで「BigQuery Data Transfer Service エージェント」の設定をしておいてください.

チュートリアル(?)

https://cloud.google.com/bigquery/transfer/docs/reference/libraries

from google.cloud import bigquery_datatransfer


client = bigquery_datatransfer.DataTransferServiceClient()
project = 'xxx'  # project idはその名前の通り, 名前だけじゃなくてIDも指定していれること exp) `xxx-12345` みたいな

# Get the full path to your project.
parent = client.project_path(project)
print('Supported Data Sources:')

# Iterate over all possible data sources.
for data_source in client.list_data_sources(parent):
    print('{}:'.format(data_source.display_name))
    print('\tID: {}'.format(data_source.data_source_id))
    print('\tFull path: {}'.format(data_source.name))
    print('\tDescription: {}'.format(data_source.description))

Amazon S3: ID: amazon_s3 Full path: projects/xxx/dataSources/amazon_s3 Description: Data from Amazon S3 to BigQuery

よくわからんけど、こんなのがでてくる。とりあえずこれがでてきてたらAPI認証はすんだ.

Pythonで構成を用意して転送の設定を行う

↑の続きでいくと

my_transfer_config = {}
response = client.create_transfer_config(parent, my_transfer_config)

こうやるとデータ転送の設定(? jobかな? 呼び方がわからない)を作ってくれる。

が、ここからとてもめんどかった。 my_transfer_configdict で用意しようとしたのだけど

my_transfer_config = {
    'display_name': 'test5',
    'data_source_id': 'google_cloud_storage',
    'schedule': 'every 1 hours',
    'destination_dataset_id': 'database',
    'params': {}  # ここにどう指定すればいいのかわからん
}

params の指定がわからずに時を過ごす

で、できたので晒す。

githubを漁った結果、↓のコードを見つけた

https://github.com/googleapis/google-cloud-python/blob/66ab881f15fbfcd4632db2cde82a460f1f84ac7e/bigquery_datatransfer/samples/create_scheduled_query.py

ここを参考にして実行した結果.

from google.protobuf import json_format as google_json_format
from google.cloud import bigquery_datatransfer_v1


# 先にparamsのvalueを用意しておく
# 何故か全部まとめてやろうとすると死ぬ
my_transfer_config_params = google_json_format.ParseDict({
    "params": {
        "destination_table_name_template": 'xxx',
        "data_path_template": "gs://xxx/*.json",
        "max_bad_records": "10",
        'skip_leading_rows': '0',
        "delete_source_files": "true",
        'file_format': 'JSON',
        'field_delimiter': ','
    }
}, bigquery_datatransfer_v1.types.TransferConfig())

my_transfer_config = {
    'display_name': 'xxx',
    'data_source_id': 'google_cloud_storage',
    'schedule': 'every 1 hours',
    'destination_dataset_id': 'xxx',
    'params': my_transfer_config_params.params
}

# 設定を作成
my_transfer_config_obj = bigquery_datatransfer_v1.types.TransferConfig(**my_transfer_config)

# 設定をrequest
response = client.create_transfer_config(parent, my_transfer_config)

これでできた...疲れた