開発者としてのキャリアが長い人にとっては、アーキテクト系よりもこちらのデベロッパー系資格の方がワクワクするのではないだろうか。
AWS認定デベロッパーアソシエイト(DVA-C01) 公式サイトはこちら
AWS認定デベロッパーアソシエイト合格への道(まだ受けてません)
この試験で評価する能力
- 主要な AWS サービス、AWS の用途、および AWS アーキテクチャに関するベストプラクティスについての知識。
- AWS を使用してクラウドアプリケーションを開発、展開、およびデバッグするスキル。
試験分野
分野 | タイトル | 比重 |
分野1 | 展開(デプロイ) | 22% |
分野2 | セキュリティ | 26% |
分野3 | AWSサービスを使用した開発 | 30% |
分野4 | リファクタリング | 10% |
分野5 | モニタリングとトラブルシューティング | 12% |
AWS認定デベロッパーアソシエイト 展開
デプロイパターン(リリース時)
デプロイパターン | 説明 |
In-Place | 稼働中の環境に新しいアプリをリリースする。 いわゆる、通常のリリース。 |
Liner(線形) | 一定時間間隔ごとに一定の割合で新アプリを置き換えながらリリースする。 |
Canary | 最初は10%のみで、数分後にすべてなど、割合によって段階的にリリースする。 Canaryは密告者の意。 |
Blue/Green | 現行とは別環境に新バージョンをリリースし、リクエスト送信先を切り替える。 |
Rolling | サーバーをいくつかのグループに分けて、グループごとにIn-Placeでリリースしていく。 |
Immutable | 現行サーバーとは違う新サーバーを構築し、新サーバーにリリースする。 |
All at once | すべてのサーバーを同時にIn-Place更新する。 |
AWS CLIのインストールと設定
インストール
DAVのためのハンズオンを進めるには、AWS CLIをインストールする必要がある。
特に、intelliJからCodeCommitをGitリポジトリとして使用するためにも必要。通常のHTTPSだと「invalid Request」と表示され、使用できなかった。
AWS CLIにはversion1 と version2 がある。現在はversion2がメジャーバージョンとなっている。
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
--以下、確認コマンド
$ which aws
/usr/local/bin/aws
$ aws --version
aws-cli/2.2.7 Python/3.8.8 Darwin/20.3.0 exe/x86_64 prompt/off
使用のための設定
$ aws configure
AWS Access Key ID [None]: xxx
AWS Secret Access Key [None]: xxx
Default region name [None]: Tokyo
Default output format [None]: json
IAMユーザー>認証情報タブでアクセスキーIDとシークレットアクセスキーを参照できる。
AWS CodePiplineの設定手順
Code Pipelineは、次の3つを選択することでコミット〜ビルド〜デプロイを自動化できる。
- ソースステージを追加する(元ソースコード群の置き場所を選択する)
- ビルドステージを追加する(誰がビルドするかを選択する)
- デプロイステージを追加する(誰がデプロイするかを選択する)
1.CodePipelineのソースプロバイダーを選択
ソースプロバイダーはパイプラインの入力元となるソースコードの置き場所のこと。
Code Commit、ECR、S3、Github、Bitbucketから選択することができる。
2.Buildプロバイダーを選択
入力されたソースコードを誰がビルドするか選択する。
新規にJenkinsインスタンスを設定するか、CodeBuildを設定していればそれを選択できる。
3.デプロイプロバイダーを選択
ビルドされた成果物のデプロイ先を選択する。
Code Deploy、Elastic Beanstalk、ECS、S3などいろんなところにデプロイできる。
Amazon Kinesis Data Stream
Kinesisの概念は開発者ガイドの説明が最もわかりやすい。
Kinesisでできること
プロデューサー(データの送信元)が送信したデータを、Kinesisはストリーム化し、コンシューマー(データを受け取り処理するプログラム)に送信する。
利用シーン
- Webアプリが継続的にデータを送信する
- Webアプリのログ
Kinesisの専門用語
- プロデューサーは、Kinesisに対してレコード(扱いたいデータ)をプッシュする。
- レコードは下記3つから構成される。
- シーケンス番号
- パーティションキー…割り当てるシャードを指定するもの。
- データBlob…扱いたいデータ本体(最大1MB)
- レコードは下記3つから構成される。
- レコードはKinesisに設定されたいづれかのシャードに割り当てられる。
用語集
AWS Code Commit | AWSが管理するGitサービス。Gitリポジトリを作成できる。 |
AWS Code Build | |
AWS Code Deploy | |
AWS Code Pipeline | AWS Code Commit、Code Build、Code Deployを束ねてビルド〜デプロイを自動化できる。 Code Commitや Code Build以外にも、GithubやJenkinsなどのソース置き場やビルドプロバイダーを選択できる。 |
AWS Elastic Beanstalk | |
AWS CodeStar | 作成したいプロジェクトの形式を、Spring/HTML/Express.js などから選択することで、AWSサービスへの展開とCD/CIパイプラインを簡単に作成できる。 |
AWS Code Artifact | maven/gradle/npm のようなパッケージマネージャに対して、自作のソフトウェアを配信できる。 |
AWS Code Guru | ・アプリケーションのパフォーマンスを可視化できる。 ・CodeCommit/Githubなどと連携し、自動でコードレビューを行ってくれる。 |
API Gateway | Rest API を構築するサービス。 LambdaやEC2,DynamoDBのフロントドア(窓口)として機能する。 |
Amaozn ECR | Amazon Elastic Container Registryの略。 コンテナイメージをセキュアに管理(登録・更新)できる。 |
AWS Chatbot | Amazon ChimeまたはSlackとAWSの諸サービスを繋ぐために、AWS ChatbotにAmazon ChimeまたはSlackのアカウントを登録する必要がある。 |
AWS OpsWorks | Chef や Puppet を使って運用を自動化する。 サーバーの構成管理ツールである。 レシピにサーバー構成を記述し、レシピに基づき自動で構築される。 CloudFormationはAWSリソース全体を管理対象とするが、OpsWorksはサーバー内の構成管理に留まる。 |
AWS SAM | サーバーレスアプリケーション構築用のオープンソースフレームワーク。 |
サーバーレスアプリケーションモデル(AWS SAM)
AWS SAMとは、Cloud Formationの拡張機能。Lambda、API Gateway、DynamoDB、S3などを組み合わせたサーバーレスアプリの構築を自動化できる。
アプリのタイプごとのデプロイパターン
これらのパターンをCodePipeline化できれば、DAVの展開分野はOK。
静的プロジェクト
HTML/CSS/JPGのみの静的Webサイトのホスティングパターン。
S3でホスティング(推奨)
- GitHubに静的WebサイトのコンテンツをPUSH。
- S3にバケットを作っておく。
- CodePipline
- ソースプロバイダーに1のリポジトリを指定。
- ビルド設定はスキップ。
- デプロイ先にS3を設定。
- ここまでやると、S3にGithubのファイルがコピーされる。
- S3の操作
- 2で作った静的ウェブサイトのホスティングをするよう設定する。
- ファイルがアップロードされたら、自動で公開するようバケットポリシーを設定する。
- 見れるようになっている。
- 本番ではさらに、Route53を利用して独自ドメインで運用する。
世界を対象とした静的Webサイトであれば、さらにCloud Frontで世界中のエッジロケーションに配信するべきである。
EC2でホスティング
動的プロジェクト
Java -SpringでThymeleafを使うようなプロジェクト。
動的プロジェクト(サーバーレス型)
フロントにVue.js、バックエンドAPIはJava-SpringまたはJava Script(Express.js)を使用するようなプロジェクト。
AWS認定デベロッパーアソシエイト セキュリティ
ネットワークのセキュリティ
認証と認可
暗号化
用語 | 説明 |
Amazon Cognito | シンプルでセキュアなユーザーのサインアップ、サインイン、およびアクセスコントロール。 簡単にアプリにログイン機能を付与できる。 |
AWS Systems Manager | AWS の運用上のハブとなり、アプリとリソース全体の運用上の問題を一元的に追跡および解決できる。 |
AWS Secrets Manager | データベース認証情報、API キー、その他のシークレットを簡単にローテーション、管理、取得する。 シークレットとはkey-value形式の値である。 AWS SDKを通じてシークレットを取得する。 |
AWS KMS(Key Management Service) | データの暗号化やデジタル署名に使用するキーを簡単に作成して管理する。 |
AWS Certificate Manager | SSL/TLS 証明書を簡単にプロビジョニング、管理、デプロイできる。 |
AWS KMSとSecrets Managerの違い
KMSは暗号化キーを管理するシステムである。
つまり、Secrets Managerで管理しているID/PWを、KMSで管理している暗号化キーを使用して暗号化/復号化する。
KMSで管理している暗号化キーは、様々なAWSサービスと統合して利用する。
例えば、AWS Systems Manager パラメータストアで管理している環境変数を暗号化するために利用することができる。
AWS認定デベロッパーアソシエイト AWSサービスを使用した開発
ECSとFarateの違い
Fargate の Amazon ECS にコンテナをデプロイする。
Lambda
Lambdaは関数自身に加えて、
・トリガー
・送信先
を設定できる。
Lambdaのトリガー
API Gatewayをはじめ、様々なAWSサービスを契機にLambda関数を実行できる。
API Gatewayをトリガーに指定すると、HTTPアクセスを契機に実行する一般的なAPIを構築できる。
Lambdaの送信先
Lambdaの呼び出し結果を別のサービスに送信できる。
非同期呼び出し
Lambda関数の処理失敗時 or 成功時を選択する。
そのときにSNSやSQS、または別のLambda関数に結果を送信できる。
ストリーム呼び出し
DynamoDBまたはKinesisを指定できる。
API Gateway
API Gatewayで作成できるAPIタイプ
APIタイプ | 説明 |
HTTP API | API Gatewayへのリクエストを他のHTTPに転送するようなAPIである。 |
Websocket API | チャットアプリのように、永続的な接続を提供するWebsocketを使用するAPIである。 |
Rest API | リクエストとコントロールを完全に制御できるRest APIである。 |
Rest API(プライベート) | 特定VPC内からアクセス可能なRest APIである。 |
API Gateway と転送先を紐づけることを統合と言う。
Lambdaの一時ファイルはLambda関数デプロイ先の/tmpに格納される。
カスタムドメイン名
API Gateway では、カスタムドメイン名を設定できる。
カスタムドメイン名を使用しない場合、下記のようなURLが割り当てられる。
https://fydpfjv54f.execute-api.ap-northeast-1.amazonaws.com/
その際、TLS(Transport Layer Security SSLの次期バージョン)の設定が必要となる。TLSにはサーバ証明書が必要となるが、AWS Certificate Managerで作成できる。
AWS Certificate Manager は SSL/TLS証明書を管理するサービスである。
Certificate Manager で管理している証明書はAWSのELB/CloudFront/API Gateway/Beans talk等で使用できる。
API Gatewayのステージ
API Gatewayでは同一APIに対して複数のステージ(環境)を設定できる。
例えば、同一APIを開発環境用、本番環境用など複数ステージに分けることができる。
ステージ名 | URL |
$default(本番) | https://jp9xf1nhc.execute-api.ap-northeast-1.amazonaws.com/ |
develop1 | https://jp9xf1nhc.execute-api.ap-northeast-1.amazonaws.com/develop1 |
develop2 | https://jp9xf1nhc.execute-api.ap-northeast-1.amazonaws.com/develop2 |
各ステージには、ステージ変数を設定できる。
API Gateway の統合
API Gatewayに作成したAPIがリクエストを受け取り、その転送先(処理する実態)を設定することを統合と言う。
統合先は次のようなものが選べる。
- Lambda関数
- AWS Lambdaに作成したLambda関数を呼び出す。
- Lambdaプロキシ統合を有効化することで、Lambda関数のイベントでリクエストの詳細を利用できるようになる。
Lambda側の実行メソッドのシグネチャやレスポンス形式が固定される。
- HTTP
- 別のURLへリクエストを転送できる。
- HTTPプロキシ統合を有効化することで、
- AWSサービス
- VPCリンク
API Gatewayのタイムアウト
デフォルトのタイムアウト時間は29000ミリ秒(29秒)である。
DynamoDB
RDB | DynamoDB |
テーブル | テーブル |
行(レコード) | Item |
列 | Attribute |
DynamoDBのキーの指定パターン
・Partition Keyのみ
Partition KeyがRDBの主キーに当たるが、Dynamo DBはKey-Value型であり、特にItemのKeyに値する部分となる。
ただし、Partition Keyはアイテム間で重複でき、ユニークである必要はない。重複のある場合に、次のSort Keyを使用して一意制を確保できる。
・Partition Key + Sort Key
Partition Keyに加えて任意のAttributeにSort Keyを指定できる。
この項目はソートや絞り込み(== <> between etc...)に利用できる。
・注意点
Parition Key、Sort Keyに設定できるのはString、Number、バイナリ型のAttributeのみである。
DynamoDBでは主キーは最大2つ(Partition KeyとSort Key)である。
Partition KeyまたはSort Key を複数指定することはできない。
DynamoDBの性能はキャパシティユニットで決める
DynamoDBへのRead/Writeそれぞれに対して、秒あたりの読み書きできる容量のことをキャパシティユニットと言う。
RCU | WCU | |
単位ごとの回数 | 2回/秒(結果整合性) 1回/秒(強い整合性) | 1回/秒 |
1回の上限サイズ | 4KB | 1KB |
デフォルト値 | 5RCU =毎秒10回の読み込み | 5WCU =毎秒5回の書き込み |
例)毎秒100回のR/Wに 要するサイズ | 50RCU | 100RCU |
RCU…Read Capacity Unit = 読み込みキャパシティユニット。
1RCU=2回/秒の読み込みができる。(結果整合性の場合)
1回の読み込みサイズの上限は4KBである。
つまり、1RCUで4KBまでの項目なら2回読み込むことができる。
4KBまでの項目を毎秒100回読み込むためには、50RCUが必要となる。
ただし、強い整合性の場合は、1RCU=1回/秒となる。
WCU…Write Capacity Unit = 書き込みキャパシティユニット。
1WCU=1回/秒の書き込みができる。
1回の書き込みサイズの上限は1KBである。
つまり、1WCUで1KBまでの項目を1回書き込むことができる。
1.3KBの項目を書き込むには2WCUを消費する。
キャパシティモード | 説明 |
プロビジョン | キャパシティユニットを数値で指定する |
オンデマンド | 実際に利用した回数となる |
DynamoDBのAutoScalingではRCU/WCUがスケールアウトする。
Dynamo DBのTTL
TTLとはTime To Liveの略。
テーブル内のアイテムを自動削除してくれる機能。
アイテムの任意のAttribute(数値列である必要がある)を基準に、削除期間を設定することができる。
DynamoDBとElastiCacheの使い分け
永続化したいデータはDynamoDB。揮発性データを扱う場合はElastiCache。
揮発性データを扱うだけなら、ElastiCacheの方が高速で安価になる。
AWS Elastic Beanstalk
Beanstalkのプラットフォーム(動作環境)
Beanstalkのアプリ実行環境をプラットフォームと言う。
Docker/Java/Tomcat/Node.js/Python/Ruby/.NET などが用意されている。
プラットフォームはJavaの場合、Correto11などが用意されており、アプリ作成時に選択する。
また、1つのBeanstalkアプリは下図のように複数の環境を作成することができる。
SampleApp
├ develop1> http://Smapleapp-develop1.eba-6cxakvqz.ap-northeast-1.elasticbeanstalk.com/
└ develop2 > http://Smapleapp-develop2.eba-6cxakvqz.ap-northeast-1.elasticbeanstalk.com/
Beanstalkへのデプロイ
Beanstalkアプリを各環境にデプロイする方法は2つある。
方法 | 説明 |
コンソールからアップロード | ソースコード群をコンソールからアップロードする。 |
パブリックS3から取得 | Beanstalk側でS3から取得してくれる。 |
AWS SQS
キューを使用するメリット
システムから高負荷プロセスを分離できる。プロセスをバッファリング(蓄積)して、バッチ処理を行うことができる。
SQS キューの種類
- 標準のキュー
- 少なくとも1回はメッセージを配信する。
- メッセージの順序は保持・保証されない。
- メッセージが重複して配信されることもある。
- FIFOキュー
- 順序が厳密に保持される。(先入先出配信)
- メッセージは1回のみ配信される。
FIFO(First In First Out 先入先出)の構造をキューという。
LIFO(Last In First Out 後入先出)の構造をスタックという。
SQSのセキュリティ
メッセージの送信者・受信者それぞれについて、
・キュー所有者のみ
・指定されたAWSアカウント、IAMユーザー、IAMロールのみ
を選択・設定することができる。
デッドレターキュー(DLQ)
キューの消費に失敗した場合、別のキューに失敗したキューを移動できる機能をDLQという。
キューに対してDQLを有効にすることで、キュー消費失敗時の原因切り分けに利用できる。
AWS認定デベロッパーアソシエイト リファクタリング
DAVで問われるリファクタリングとは、ソースコードのリファクタリングではない。AWSの各リソースやサービスの選択を最適化することである。
AWS認定デベロッパーアソシエイト モニタリングとトラブルシューティング
Amazon CloudWatch | ログ、メトリクス、およびイベントという形式でモニタリングデータと運用データを収集する。 |
VPC フローログ | VPC のネットワークインターフェイスとの間で行き来する IP トラフィックの送信元、送信先、拒否or許可等の情報をS3やCloudWatchLogsに出力できる。 VPC画面から設定する。VPCの設定が適切かテストするときにも使用される。 |
AWS CloudTrail | マネコン、CLI、SDKからの操作を全て記録し、S3バケットに保存する。 |
AWS X-Ray | 本番環境や分散アプリケーション(マイクロサービス群)の分析とデバッグができる。 |
AWS認定デベロッパーアソシエイトで重点的に理解すべきサービス
Amazon EC2
Amazon S3
Amazon Cognito
AWS Lambda
AWSで開発するには
MacでAWS Codecommitを利用する
Macは初期状態では、SourceTreeやIntellijからCodeCommitに接続できません。
Cloneしようとしても、invalid Requestになってしまいます。
intelliJ-Java-Spring
intelliJ>plugins>AWS Toolkitをインストールする。
intelliJでCodecommitリポジトリをクローンしようとするとエラーが発生
Authentication failed for 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/xxx/'
AWSの各種サービス
コンテナ系サービス
Amazon ECR | Elastic Container Registoryの略。 コンテナのレジストリ、つまりコンテナイメージの管理サービス。 |
Amazon ECS | Elastic Container Serviceの略。 コンテナの実行環境を構築できる。つまり、コンテナを動かせる。 |
Amazon EKS | Elastic Kubernates Serviceの略。 AWS上でKubernatesを利用できる。 |
Amazon Lightsail
用意されているアプリを選択すると、アプリをセットアップしてくれるサービス。
- WordPress
- Drupal
- Redmine
- Gitlab
などを簡単に使い始めることができる。
インスタンスタイプとして、EC2同様にCPUやメモリ、ストレージ容量も選択できる。SaaSのようなもの。