aws.amazon.com
AWS ドキュメント - docs.aws.amazon.com
AWS サービス別資料 - aws.amazon.com
Amazon 様の提供するクラウドコンピューティングサービスの総称。従量課金制。基本 IaaS - Infrastructure as a Service だが PaaS - Platform as a Service ( Lamdba や Elastic Beanstalk ) や SaaS - Software as a Service ( S3 や CloudWatch ) などのサービスも展開している。
VM、DB / Storage / Network / 開発環境 / メディア / メール / AI / IoT / セキュリティ / AR / ゲーム開発 / マーケティング ... など幅広いサービスが存在する。基本設計・技術選定時に「まずは AWS サービスで近しいことができないか?」を考えて設計するとよき。
aws の web console 操作について cli でやりたいときにつかうやつ。iam user 作ってそいつのアクセスキーで profile 設定してから利用する。認証情報および profile 設定は ~/.aws/credentials
~/.aws/config
に保存されてる。
# IAM USER + そいつのアクセスキーを払い出してから
$ aws configure --profile ${ACCOUNT_NAME}
> AWS Access Key ID [None]: ****************DMH2
> AWS Secret Access Key [None]: ****************bHBU
> Default region name [None]: ap-northeast-2
> Default output format [None]:
# 設定の確認
$ cat ~/.aws/config
[default]
region = ap-northeast-1
[profile other-account]
region = ap-northeast-2
$ cat ~/.aws/credentials
[default]
aws_access_key_id = ****************GIXI
aws_secret_access_key = ****************dMYm
[other-account]
aws_access_key_id = ****************DMH2
aws_secret_access_key = ****************bHBU
aws 関連の cli ツールを使うときは、だいたいどのアカウントを使うか --profile
オプションで指定する感じになる。
- アカウント作成時にやるやつ
- 料金体系や全体感
- 大規模運用・パフォーマンス・高可用性
- Infrastructure as Code (インフラのコード管理) / Architecture as Code (アーキテクチャのコード管理)
- Terraform - AWS リソース全体のコード管理ができる IaC ツール
- Serverless Framework - AWS リソースをサービス単位で切り出す AaC ツール
- AWS CDK - プログラミング言語でインフラ構成する AaC ツール
- AWS Amplify - Web アプリのホスティング + Backend 構成に特化した AaC ツール
- AWS Copilot - コンテナアプリの構成ができる AaC ツール
- サーバレスアーキテクチャとしての AWS 利用について
セキュリティ上の驚異をログデータなどから分析・調査・評価するサービス。
AWS Budgets
AWSの料金アラートの違い
Amazon Chime および Slack で予算アラートを受け取る
- 予算管理するためのアラート送信サービス
- chatbot と組み合わせて slack 送信とかできる
AWS サービス全体の管理・運用を補助するサービス。
EC2 などインスタンスへの SSH セッションを管理できる機能。
$ aws ssm start-session --target i-xxxxxxxxxx
AWS サービス・リソースに対するアカウント・ロールの権限管理ができる。
- Policy: AWS リソースに対する、何らかのアクションを許可/制限する、といった権限の最小単位
- S3 Resource
arn:aws:s3:::hoge-bucket
に対して読み取り Actions3:ListBucket
を許可Allow
するなど
- S3 Resource
- Role: 上記 Policy を 1 つ以上組み合わせて作成し、User や Group や EC2 などのリソースに付与することができる権限のまとまり
- User: 文字通り AWS サービスを利用するユーザリソース
- AWS Root ユーザは基本使わずに、様々な用途に応じたユーザをこちらで発行する
- 実際に人が用いるアカウントの他に、プログラムでリソースを操作する際にも利用される
- Group: User を束ねるグループ、ここに Role を付与して複数 User の Role をまとめて管理とかできる
認証・認可のための Token 発行サービス。
- 署名付き URL を使用してオブジェクトをアップロードする (AWS SDK for Ruby)
- AWS STSのAssumeRoleを利用してS3にアップロードしてみる
- ↑ で触れてないが「信頼関係の編集」から
Principal
を設定しないとだめよ
CloudWatch は AWS の各種リソースのモニタリングサービス。2週間分の監視データを常に保存しており、オンプレミスでいうところの監視サーバみたいなサービスを導入できる。監視対象についてアラーム・通知を飛ばしたりクーロンっぽくバッチ ( lambda ) を走らせたりできる。
- Amazon CloudWatch
- Amazon EC2 のモニタリング
- 推奨 CloudWatch アラーム
- インスタンスの CloudWatch アラームの作成
- 【AWS】CloudWatchでの監視項目まとめ
CloudWatch Management Console より以下メトリクスを監視 → 閾値を超えた際にアラーム ( アラートメールなど ) を送信したりできる。
- CPU 使用率
- アラームを作成
- EC2 > インスタンス別メトリクス
- インスタンス ID: EC2 のインスタンス ID ( i-d4a... )
- メトリクス名: CPUUtilization
- アラーム定義作成
- アラームしきい値: >= 80 / 間隔 5 分間 / 1 データポイント
- アラームアクション: 通知
- システムチェック ( EC2 ステータス )
- ログ
- ディスク使用率
- メモリ使用率
- [AWS]ECSを利用し、コンテナのログをCloudWatch Logsへ出力する
- ECSとCloudwatch LogsでRailsを運用するログ設定
- Railsのログを awslogs で Cloudwatch Logs に出力する
- RailsをAmazon ECS(AWS Fargate)で運用する際のログ設定で工夫した点
- Monitor Application Errors with AWS CloudWatch and AWS Chatbot-Slack Client
- AWSのPersonal Health DashboardからSlackへ通知を受け取る方法
- tilfin/ougai - Rails のログフォーマッタ、シンプル
- ActiveSupport::TaggedLogging - タグ付けするならこの子が便利
- 構造化ログのススメとRuby向けロガーOugaiを作った理由
- Railsで更新系のSQLだけログに出力する方法
- 処理の間で普通に吐いてもいいけど、ロギングは Subscriber で組んだ方が確かに筋がいい
- こういうの使えば Audits とかやらんでも良い気がする
アプリケーションの CI/CD サービス。CodeCommit, CodeArtifact, CodeBuild, CodeDeploy, CodePipeline の組み合わせで使う (似たような名前でややこしい ...) 。
リソースを組み合わせた仮想プライベートネットワークを構築できる。仮想オンプレ環境作ったり、EC2 や RDS などサーバインスタンスを利用する際にはこれで仮想ネットワークを切って、中に入れる感じ。
DNS サービス、ドメイン登録 → Web アクセス可能な AWS リソースの host へ CNAME で飛ばしたりできる。
通称 ELB。ネットワーク負荷分散のためのロードバランシングサービス。
- ALB: Application Load Balancer - HTTP/2 や WebSocket にも対応した Web アプリ用ロードバランサ
- NLB: Network Load Balancer - TCP トラフィックなどネットワーク用ロードバランサ
- CLB: Classic Load Balancer - EC2 のロードバランシングに特化したロードバランサ
キャッシュ、URL ルーティングなど機能豊富な CDN サービス。S3 や EC2 の前段に噛ますみたいな構成で使う。
- CloudFrontの署名付きURLでプライベートコンテンツを配信する
- CloudFront+S3で署名付きURLでプライベートコンテンツを配信する
- 【AWSリバイバル】CloudFrontの署名付きURLで「3分で見れなくなってしまう秘密のページ」をつくってみよう!
- CloudFrontの署名付きURLをRubyで発行する
- CloudFront+S3に対して自作システムにログインしないと配信・アクセスできないようにする。
- Multi Origin にするときこれまじでハマった
- CloudFront のキャッシュ破棄
- 【AWS】SES構築について
- Amazon SES にSPF、DKIM、DMARC設定と、サンドボックスを解除してメール送信してみた
- Amazon SESによるメール送信環境の構築と実践
- Amazon SES に SMTP認証設定を追加してメールクライアントから SMTPサーバとして利用してみた
- [AWS] SESで送信したメールがGmailで迷惑メールにされるのを防ぐ方法
- Amazon SES 独自ドメインでメール送信してamazonses.com経由と表示されるケース
そのまんま、マネージドなメールサーバを提供するサービス。ざっくり以下の手順で構築。
- sandbox の解除
- dashboard から request 送る感じ
- 文章は、送信頻度・目的 (マーケ、トランザクション)・苦情対策体制の要点伝えて chat gpt に作ってもらうといい
- route53 に host zone 作成
- 先に domain は取得しておく
- verified identify 作成 => status success 待ち
- domain or email verification する
- domain 名以外は default のままで ok
- txt レコードの required action 出るけど hostzone 設定済みなら少し待てば自動で付与される
- bounce feedback 通知設定
- verified identify > 通知 > フィードバック通知から sns 作成 & 登録
- SPF (Sender Policy Framework 送信元ドメインのサーバポリシー) と MAIL FROM 設定
- custom mail from domain ってやつを設定 (サブドメインみたいなやつ)
- MX, TXT レコードを DNS レコードへの発行ボタンから route53 へ publish
- DMARC (Domain-based Message Authentication, Reporting, and Conformance 送信元ドメインの認証失敗時の処理ポリシー) 設定
- route53 のマニュアル にある通りに txt レコードを route53 へ登録 (ドメイン名は変えるぽい)
- レコード名
_dmarc.your-domain.com
レコードタイプTXT
値"v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@your-domain.com"
みたいな?
- DKIM (DomainKeys Identified Mail 送信元ドメインの電子署名) 設定
- 3 で easy dkim を enabled にしたら自動的に route53 に publish されるぽい
- 一応当該の cname レコードが 3 件入ってるか見てみる
- SMTP 設定
- ses 認証 iam user を作成
- こいつの smtp の username, password を download
- この ses smtp から送信する際に FROM メールアドレスが verified identify の設定に応じて信頼性・正当性証明される感じ
- port は 587 でいい
dkim や dmarc や spf などは ↓ のような不正対策で、やらんと迷惑メール行き。プログラムから SMTP 送信するときは送信メールの from の サブドメイン部分を を MAIL FROM と一致させる必要あるので注意。
Dear AWS support team.
We are developing a small application for an enterprise. This application is intended for a limited number of users, and is used by a few to several dozen people, and accessed several times a day.
Our application is designed to authenticate a user's login with a temporary URL via email submission. This authentication system adopts passwordless authentication using a library called next-auth. When the user requests login, the application will send the user an email containing a temporary URL. The user can securely log into the application by clicking the URL in that email.
This email is sent via SMTP from our Node.js application running on AWS ECS using Amazon SES. This system is only used for login transactions and does not send mass marketing emails or notification emails to users.
Email recipient list is only for a select group of around ten users. The management of the recipient list (adding and removing users) is performed manually by the developer as needed. And we anticipate sending around 0 to 10 emails per day.
As our application is not directed towards consumers, we do not provide an unsubscribe link or similar in our emails. However, in case our domain is misused, such as for sending confidential information or for cyber attacks, we receive notifications via Slack if complaints are raised, and the developer takes appropriate action.
sandbox 開けるまでは verified identify でメールアドレスの認証をさせれば、そのアドレスだけには送信可能になるらしい。
そのまんま、時刻同期サービス。VPC 内リソース (EC2 とか) から外部アクセスなしに時刻同期できる他、公開 NTP サーバとしても利用していいみたい。
サーバレスでプログラム (Lambda 関数) を実行できるサービス。ほかサービスと組み合わせて様々な用途に利用できる。
- Batch でジョブをセットしてサーバレス cron 作ったり
- API Gateway と組み合わせてサーバレスな API サーバ作ったり
- CloudFront のリクエストを受けた際の callback にしたり
- CloudWatch Events/Alerm をトリガに通知などを走らせたり
- Lambda など AWS リソースへトリガできる Web API を作ったりできる
- ゼロから作りながら覚えるAPI Gateway環境構築
- API Gateway + WebSocket の基本的な使い方を調べてみた
- APIGatewayでWebSocketが利用可能になったのでチャットAPIを構築してみた
- api gateway + websocket ではエラーハンドリングを onmessage でやるほうがよき?
- Cognitoで認証されたユーザーだけがAPI Gatewayを呼び出せるオーソライザーを使ってみた
GraphQL のマネージド・サービスとして Pub/Sub な API を提供する。裏で DynamoDB とか Lambda とか使う感じみたい。
AMI ( Amazon Machine Image ) をもとに VM サーバインスタンスを展開できるサービス。
インスタンス生成時の自動割当 IP アドレスは 固定化されていないため再起動時に変わってしまう 。Elastic IP を取得しインスタンスへ割り当てることで、IP アドレスをインスタンス毎に固定化できる。
Elastic IP アドレスの保持数はアカウント毎に有限で「申請して無料で増やす」ことができる。また「どのインスタンスにも割当たっていない Elastic IP アドレス」は課金対象になってしまう。インスタンスを増やす度に事前に追加申請をしていく運用が必要になる。
AMI として Amazon Linux を選ぶと、最初から yum リポジトリに Amazon 提供リポジトリが登録されている。当然 CentOS や Ubuntu のパッケージ管理システムとは別なので、依存問題注意。
AWS Marketplace で「Sold by CentOS.org」となっているのが CentOS.org 提供のオフィシャル AMI です。コミュニティ AMI から変なのいれないように。
Amazon Elastic Container Service (Amazon ECS) は、Docker コンテナをサポートする拡張性とパフォーマンスに優れたコンテナオーケストレーションサービスです。これにより、コンテナ化されたアプリケーションを AWS で簡単に実行およびスケールできます。
EC2 が VM ベースなのに対し、ECS は Docker コンテナベースでアプリケーションを動かすためのサービス。EKS は k8s のマネージド・サービス。ECS, EKS ともに内部で EC2 を使うか Fargate (Heroku Dyno みたいなやつ) を使うか選べる。
- あなたの組織に最適なECSデプロイ手法の考察
- Fargateの料金は月に何円ぐらいかかるのか
- Amazon ECS で実行するコンテナをローカルでテストする
- ロールやポリシーなども含めたテストができるぽい
モノリシックアプリケーションをマイクロサービスに分割する - aws.amazon.com
DockerとECSで初めてマイクロサービス化(するチュートリアルを)してみた - dev.classmethod.jp - 上記の解説このチュートリアルでは、モノリシックな node.js アプリケーションを Docker コンテナにデプロイし、ダウンタイムなしでアプリケーションをマイクロサービスに分離します。この node.js アプリケーションでは、スレッド機能付きのシンプルな掲示板とユーザー間のメッセージをホストします。
Amazon S3
S3の料金体系が分かりにくいと聞かれたので纏めた S3のアクセスコントロールまとめ - これ絶対理解して
いわゆるオブジェクトストレージ/アクティブストレージサービスと呼ばれるもの。assets がちょろっとある程度の軽い Web サイトなら不要だが、ファイルを扱う Web アプリならストレージ選定はこれ一択。
- これで大抵賄える!AWS SDK for Ruby V3でのS3操作まとめ!!
- 【AWS S3】S3 Presigned URLの仕組みを調べてみた
- S3に直接アップロード可能なPre-Signed URLをLambdaで作ってみる
- JavaScriptでAmazon S3にファイルをアップロード
- ブラウザからS3に巨大なファイルを低メモリで送りつけるアレ
マネージドな RDBMS の管理サービス。
一般公開された Amazon Aurora Serverless v2 を東京リージョンで試してみた
ACU(Aurora Capacity Unit)ってなに?
- serverless な rds
- スケール遅いけど「停止」もできて安い v1 と、停止できないけどスケール早い v2 みたいなざっくり 2 パターン
- v2 は ACU (キャパシティ) で料金が決まるっぽい
- ACU はざっくり「処理性能」と「データ容量」のキャパシティで 1 ACU 2 GiB という単位
- 最小と最大スケールを 0.5 ~ 128 の間で決められる
- 0.5 (1 GiB) の 2 インスタンスで常時稼働すると毎月 2 万円くらいになる
- 8 (16 GiB) で通常 rds の db.r5.large spec 相当
- ので「アクセス頻繁じゃないけど、具体的にはスケールどこまですればいいのかわかんない」なら最小 0.5 ~ 最大 4 とかで初めても十分っぽい
- Create, Read, Update, and Delete an Item with Python - docs.aws.amazon.com
- boto3 dynamodb
- DynamoDBのキー・インデックスについてまとめてみた
- Amazon DynamoDBのプライマリーキーの2つのタイプについて理解できたことをまとめました
- DynamoDBをPython(boto3)を使って試してみた
Key-Value 型のマネージド NoSQL データストア。高速に動作する KVS という点で Redis と似ているが、永続化が必要なケースに利用される。
絞り込みで使う値をパーティションキーにして、ソートキーとの組み合わせで一意性を保たせるのがよさそう。ざっくり以下のような特徴を念頭に入れて選定するといい。
- 毎秒 2,000 万件を超えるリクエストをサポート
- SQL のような検索や集計はかなり低速 & リソースを食うので向いていない
- 検索では Scan と Query が実行できる、基本 Query だけで設計すべき
- Scan は全体スキャンで負荷が高いかわりに全項目を探索可能
- Query は絞り込みが効いて軽いがパーティションキー、ソートキー、インデックス以外指定不可
- パーティションキー (HASH Index) と ソートキー (RANGE Index) の設計が大事
- テーブル内のレコードの一意性 (Primary Key) はパーティションキーのみ or パーティションキー + ソートキーで担保
- https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-sort-keys.html
- 上記パーティションキーとソートキー以外は、テーブル作成時に定義しない
- GSI - グローバルセカンダリインデックスを後から追加して、Query の条件にできる (制限あり)
- プロビジョニングスループットに対して課金される
- https://dev.classmethod.jp/articles/fallback-queueing-pattern-on-dynamodb/
-
「どのくらいの頻度でどのくらいのデータ量を読み書きをする予定なのか」というユーザからの事前申告に基づいて、Amazonがその処理能力を確保し、その確保分に対して料金が発生します
- 1 秒間に n read/write をする予定か?を先に決めておく感じ
- ここが参考になる - DynamoDBのキャパシティユニットについて
- データ長は定義しない、項目の最大サイズは属性名を含めて 400KB みたい
- Point-in-time Recovery で継続的バックアップ可能
- 35 日まで保存、直近 5 分前まで復元できる
- On-Demand Backup and Restore
- 手動バックアップ・復元も可能
S3 に export して athena で sql 検索とか。
https://docs.aws.amazon.com/mediaconvert/latest/ug/mediaconvert-guide.pdf
- 脱 ElasticTranscoder ~ AWS MediaConvert への導入プロセス
- HLS + AES にも触れてる
- 暗号化設定 https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/MediaConvert/Client.html#create_job-instance_method
- 鍵生成 https://docs.aws.amazon.com/code-samples/latest/catalog/ruby-s3-s3_create_AES_key.rb.html
- static_key_value に
OpenSSL::Cipher::AES.new(128, :CBC).encrypt.random_key.unpack1('H*')
いれた
- MediaConvert+Lambda+S3イベントで全自動変換フローの構築
- AWS Elemental MediaConvertで動画変換が完了した事をSlackに通知する仕組みを作ってみた
- 動画配信におけるコンテンツ保護の重要性とそれを実現する仕組みを自分なりにまとめてみた
- Elemental MediaConvertを利用してmp4をHLS変換 + サムネイル出力
- hls でストリーミング + 認証付き URL で配布するときは cloudfront 必須
- Youtube Live みたいな 1:多 向けライブストリーミング配信できるやつ
- https://gigazine.net/news/20200716-amazon-interactive-video-service/
- 大規模マルチプレイなゲームサーバの構成・管理サービス
- ざっくりいうと、マッチング => ゲームの部屋立てリクエスト => 空いてる EC2 にゲームアプリデプロイして割当て ... みたいなことしてくれるやつ