AWS
一般
アクティブなリソースの確認
請求額アラート設定
- IAMルートユーザーでログイン
- IAM設定画面でユーザ名をクリック
- 表示されるメニューから「請求ダッシュボード」をクリック
- 画面左側のメニュー一覧にある「請求設定」をクリック
- 「コスト管理設定」の中にある「無料利用枠の使用のアラートの受信」にチェック
- その下のEメールアドレス欄に送信先のメールアドレスを指定
- 「請求アラートを受け取る」にチェック
請求額アラート設定: 一定の請求額を超えそうな場合にメールを受信する方法
- AWSマネジメントコンソールを開く
- CloudWatchを開く
- 「バージニア北部」リージョン(us-east-1)を選択
- 画面左側のメニュー一覧にある「アラーム」の中の「請求」をクリック
- 初期設定と追加設定の二通りある
- 初期設定の場合
- この表の下部中央にある「アラームの作成」ボタンをクリック
- 表の右上にある「アラームの作成」ボタンではない
- 「メトリクスと条件の指定」画面でアラーム設定
- 追加設定の場合
- 「アラームの作成」ボタンをクリック
- 「メトリクスの選択」ウインドウを開く
- 「請求(Billing)」をクリック
- 「概算合計請求金額」をクリック
- 通過が「USD」, メトリクス名が「EstimatedCharges」の項目にチェック
- 「メトリクスの選択」をクリック
- 画面を下にスクロールし「条件」の欄を表示
- 「しきい値の種類」で「静的」を選択
- 「「EstimatedCargesが次の時…」」で「より大きい>しきい値)」を選択
- 「…よりも」ではメールを送信してもらうための基準額をUSドルで入力
- 入力が完了したら「次へ」ボタンをクリック
- 以下のアクションの設定画面の「通知」欄で「このアラーム状態が以下のとき…」は「アラーム状態」を選択
- 「SNSトピックの選択」のラジオボタンは「新しいトピックの作成」を選択
- 「新規トピックの作成中…」の「トピック名」はデフォルトのまま
- 「通知を受け取るEメールエンドポイント…」にアラートメールの送信先を入力
- 「トピックの作成」ボタンをクリック
- メールアドレスが「Eメール(エンドポイント))」に表示されていることを確認
- 「次へ」ボタンをクリック
- 「説明の追加」画面の名前と説明で「一意の名前を定義」欄にアラーム名を入力
- 必要に応じて「アラームの説明」のテキストエリアに説明文を入力
- 「次へ」ボタンをクリック
- プレビューと作成画面が表示される
- ここまでの入力内容に問題がないことを確認
- 「アラームの作成」ボタンをクリック
- アラートメールの送信先として指定したメールアドレスの受信ボックスを確認
- AWSから届いたメールに記載された認証リンク「Confirm subscription」をクリック
- 設定完了
- リージョンを戻す
短縮URLをAWS
サービスを使って作る
- .NETの「短縮URL作成」あたりを参照すること.
無料ドメインの取得
- freenomを使うと無料のドメインが取得できる
Route53
などの調査で使うには非常に便利
料金確認
ACM(AWS Certificate Manager)・Route53:お名前.comで登録したドメインをAWSでの制御に移行する
ここではphasetr.com
を例に書く.
- ACMのコンソールに移動
Route 53
の画面に移動 - パブリックホストゾーンを作成
- (四つの)NSレコードができているか確認
- お名前.comの管理画面に移動する
- 「ネームサーバーの変更」からNSレコードを全て(四つ)登録
- 必要があればしばらく待ってから(最大一日待つ必要がある)次のコマンドで設定した
NS
レコードが現れるか確認 nslookup -type=NS phasetr.com
- タイミングが速いと
- ACMの画面に移動
- 検証法は
DNS検証
を選ぶ - 作った証明書を選ぶ
- 「ドメイン」の「
CNAME
名」「CNAME
値」を調べてメモする - お名前.comの管理画面に移動する
- 対象ドメインの「DNSレコード設定を利用する」を選択
- レコードで
CNAME
を設定する - 設定を保存する
- AWS画面で証明書の「ステータス」が「発行済み」になるまで待つ
- 対象の証明書を選んで「Route53でレコードを作成」を押下
- 遷移先の画面でドメインにチェックを入れて「レコードを作成」を押下
Amplify
AWS Hands-on for Beginners(日本語)
CDK
インストール
ドキュメント・ハンズオン
- AWS Toolkit for Visual Studio Code https://aws.amazon.com/jp/visualstudiocode/
- AWS CDK, AWS SAM
- https://aws.amazon.com/jp/serverless/patterns/pattern-design-examples/
- RDS proxy
- 請求アラート, Slack通知: AWS知識本参照 https://dev.classmethod.jp/articles/notify-slack-aws-billing/
- LambdaからログをS3に吐き出す(追記し続ける)
- https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/
- https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-1st-Step-2022-confirmation_849.html
- https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-level-100/
- https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Serverless-1-2022-reg-event.html?trk=aws_introduction_page
- https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Serverless-3-2022-reg-event.html?trk=aws_introduction_page
--require-approval never
コマンド実行時にいちいちy
を渡さないで済むようにする
| cdk deploy --require-approval <LEVEL>
|
アップデート
| npm i -g npm-check-updates
ncu -g aws-cdk
npm -g install aws-cdk@<ver>
|
コマンド init
| cdk init sample-app --language typescript
cdk init sample-app --language csharp
cdk init sample-app --language python
|
コマンド diff
: ローカルとデプロイの比較
コマンド deploy
: スタックをデフォルトのアカウント・リージョンにデプロイ
コマンド ls
: アプリ内のスタックを全て表示
コマンド docs
: CDKドキュメントを開く
初期化
| mkdir cdk-proj && cd cdk-proj
cdk init sample-app --language typescript
|
特定環境のdeploy
, destroy
Program.cs
で設定しているStack
のID
を指定してcdk deploy
またはcdk destroy
すればよい.
バケットの削除
| // 削除時にs3のバケットも削除する
_ = new Bucket(this, "WorkshopBucket", new BucketProps
{
RemovalPolicy = RemovalPolicy.DESTROY
});
|
CLI
Session Managerでのポートフォワーディング, リモートホストへの接続
| aws ssm start-session --target i-0759d9149c57b9e13
|
- TODO
CDK
にする PostgreSQL
についてはPostgreSQLを参考にすること. - 注意
aws ssm start-session
は(CDKで環境設定した)適切なアカウントで実行すること. 権限エラーで実行できず, An error occurred (TargetNotConnected) when calling the StartSession operation: <ssm-managed-instance-id> is not connected.
というエラーが出る. <remote-database-host-name>
はエンドポイント名を入れればよい.
| aws ssm start-session \
--target <ssm-managed-instance-id> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"portNumber":["5432"],"localPortNumber":["1053"],"host":["<remote-database-host-name>"]}'
psql -h 127.0.0.1 -p 1053 -U pgadmin
|
| aws ssm start-session \
--target <ssm-managed-instance-id> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"portNumber":["3306"],"localPortNumber":["1053"],"host":["<remote-database-host-name>"]}'
mysql -h 127.0.0.1 --port 1053 -u admin -p
|
S3 バケット作成
| aws s3api create-bucket \
--bucket <bucket-name> \
--region <region-name> \
--create-bucket-configuration LocationConstraint=<region-name>
|
アクセスキー取得
- 参考: CloudShellを使うとローカルの設定なしでAWS CLIが使えるので必要に応じて使い分けよう
- IAMユーザーのアクセスキーの管理
- アクセスキーとシークレットキーをCSVで取得, メモ
- 次のコマンド実行
| aws configure
Default region name [None]: ap-northeast-1
Default output format [None]: json
|
- 上記設定は
~/.aws/config
に次のように記録される
| [default]
region = ap-northeast-1
output = json
|
~/.aws/credentials
にaws_access_key_id
とaws_secret_access_key
が記録される
アカウント確認
| aws sts get-caller-identity
aws configure list
|
~/.aws/cli/alias
にwhoami
として登録しておくとよい.
| [toplevel]
whoami = sts get-caller-identity
|
アカウント切り替え
| aws configure list
export AWS_DEFAULT_PROFILE=<USER_NAME>
|
アカウント登録
- 事前に
AWS
にアクセスしてIAM
からアクセスキー・シークレットアクセスキーのCSVをダウンロードしておくこと - 特に希望がない場合のリージョンとフォーマット
- リージョン:
ap-northeast-1
- フォーマット:
json
| aws configure --profile <username>
cat ~/.aws/credentials
|
タイトル通り--no-cli-pager
をつければよい.
補完設定
ドリフトの検出と解決
- 実体とスタックの乖離をドリフトと呼ぶ
- インポートで実体をスタックに取り込める
DynamoDB
参考文献
参考: Amazon DynamoDB Labs
| curl -sL https://amazon-dynamodb-labs.com/static/game-player-data/battle-royale.tar | tar -xv
|
DynamoDB Local
モデリング例
ECR
M1 Mac
でx86_64
ビルドしてプッシュする
ECR
のコンソールにアクセスする. - 適切なイメージを選ぶ.
- 画面上部の「プッシュコマンドの表示」をクリックする.
- モーダル中のコマンドを順に熟考すればよい.
x86_64
ビルドコマンドはDockerを参照すること.
Mac
でError saving credentials: error storing credentials - err: exit status 1, out:
Post "http://ipc/registry/credstore-updated": dial unix backend.sock: connect: no such file or directory``
- URL
Mac
からECR
で認証トークンを取得し、レジストリに対して Docker クライアントを認証します
のプッシュをしようとしたらタイトルのエラーが出た ~/.docker/config.json
のcredsStore
がdesktop
だったのをosxkeychain
にしたら通った
IAM
AdministratorAccess権限を与えたい
- 「アクセス権限の追加」をクリック
- 「既存のポリシーを直接アタッチ」をクリック
- 「ポリシー名」を選ぶ
MFA設定 機種変更時にMFA端末を変更
ユーザー作成
ルートアカウントへのMFAを複数人に展開
- ルートアカウントのMFAを複数設定できるようになったため, 実際に複数人に設定してもらい, 適切な権限を持つ人にルートアカウントを触れるようにしたい.
- MFA設定
- IAMの画面にアクセスしてから画面右の「クイックリンク > 自分の認証情報」リンクから画面遷移する.
- その画面でQRコード読み取りして設定できる.
- 対処1: リアルで複数名が集まれる
- このときは既にルートアカウントにアクセスできる人が実際にIAM画面にアクセスし, MFA設定のQRコード読み取り部分をその人の画面から設定して試せばよい.
- 対処2: リモートで対応したい.
- ルートアカウントの情報は適切な形で共有してあり, 複数名がMFA以外の情報にはアクセスできるとする.
- MFA認証のところまでログインを進める.
- MFA認証できる人にネット上で依頼してMFAコードを送ってもらう.
- ログインしてもらったあと, その人が対応しやすいMFA設定をしてもらう.
ロールのリスト取得
MFA デバイス解除
Lambda
公式デベロッパーガイド
Route 53
ドメイン登録
Route 53
でドメインを設定する - コンソールで
Route 53
のホストゾーンにアクセスする - コンソールからメールを送ってホストゾーンを認証する
HTTPS用のドメイン登録
- 参考
ACM
(Certificate Manager
)からパプリック証明書をリクエストする - 完全修飾ドメインには
phasetr.com
と*.phasetr.com
を指定する
- 進んだ画面で「
Route 53
でレコードを作成」をクリックして設定 - 必要に応じて時間を置いてから証明書のステータスが
発行済み
になるか確認 HostedZone
の名前を適切に設定した上で以下のコマンドで登録されているか確認する。
| HOSTED_ZONE_ID=$(aws route53 list-hosted-zones --query "HostedZones[?Name=='phasetr.com.'].Id" --output text) && echo ${HOSTED_ZONE_ID}
aws acm list-certificates --output json
|
SDK
S3で署名つきURL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | // IAwsS3FileUpload
public interface IAwsS3FileUpload
{
/// <summary>
/// `durationHours`で指定された時間の分だけ、
/// `objectKey`で指定されたファイルにアクセスする証明付きURLを生成する。
/// </summary>
/// <param name="objectKey">署名付きURLでアクセスさせるオブジェクトの名前</param>
/// <param name="durationHours">時間(hour)指定でのURLの有効期間</param>
/// <returns></returns>
string GetPreSignedUrl(string objectKey, double durationHours);
}
// AwsS3FileUpload.cs
using Amazon.S3;
using Amazon.S3.Model;
using Models;
using Services.Interfaces;
public class AwsS3FileUpload : IAwsS3FileUpload
{
private readonly IAmazonS3 _s3Client;
private readonly IConfiguration _configuration;
public AwsS3FileUpload(
IAmazonS3 s3Client,
IConfiguration configuration)
{
_s3Client = s3Client;
_configuration = configuration;
}
public string GetPreSignedUrl(string objectKey, double durationHours)
{
var bucketName = _configuration.GetValue<string>(Constants.ApBucketName);
var request = new GetPreSignedUrlRequest
{
BucketName = bucketName,
Key = objectKey,
Expires = DateTime.UtcNow.AddHours(durationHours),
};
return _s3Client.GetPreSignedURL(request);
}
}
|
Secrets Manager
値の設定
Secrets Manager
でシークレットを設定するとき, 値はキー・バリューではなくプレーンテキストでシークレットの値を貼り付けると良い. AWS上で値を取得しようとした時, ローカルと挙動が変わって混乱する場合がある.
値を取る
- 実際にコンソールでアクセスすると, 下の方にサンプルコードがある.
- これを参考にすればよい.
SES
メール送信
- GitHubを参考にすればよい.
AWS SDK
を使う場合はIAM
のアクセスキー・シークレットキーを使う.