コンテンツにスキップ

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レコードを全て(四つ)登録
      • AWSで表示されている末尾の「.」は不要
    • 必要があればしばらく待ってから(最大一日待つ必要がある)次のコマンドで設定したNSレコードが現れるか確認
      • nslookup -type=NS phasetr.com
      • タイミングが速いと
  • ACMの画面に移動
    • 検証法はDNS検証を選ぶ
    • 作った証明書を選ぶ
    • 「ドメイン」の「CNAME名」「CNAME値」を調べてメモする
    • お名前.comの管理画面に移動する
    • 対象ドメインの「DNSレコード設定を利用する」を選択
    • レコードでCNAMEを設定する
    • 設定を保存する
    • AWS画面で証明書の「ステータス」が「発行済み」になるまで待つ
    • 対象の証明書を選んで「Route53でレコードを作成」を押下
    • 遷移先の画面でドメインにチェックを入れて「レコードを作成」を押下

Amplify

AWS Hands-on for Beginners(日本語)

CDK

インストール

1
npm install -g aws-cdk

ドキュメント・ハンズオン

1
npm install -g aws-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を渡さないで済むようにする

1
cdk deploy --require-approval <LEVEL>

アップデート

1
2
3
npm i -g npm-check-updates
ncu -g aws-cdk
npm -g install aws-cdk@<ver>

コマンド init

1
2
3
cdk init sample-app --language typescript
cdk init sample-app --language csharp
cdk init sample-app --language python

コマンド diff: ローカルとデプロイの比較

1
cdk diff

コマンド deploy: スタックをデフォルトのアカウント・リージョンにデプロイ

コマンド ls: アプリ内のスタックを全て表示

コマンド docs: CDKドキュメントを開く

コマンド synth: CloudFormationテンプレート出力

1
cdk synth

初期化

1
2
mkdir cdk-proj && cd cdk-proj
cdk init sample-app --language typescript

特定環境のdeploy, destroy

  • Program.csで設定しているStackIDを指定してcdk deployまたはcdk destroyすればよい.
1
cdk deploy <stack-id>

バケットの削除

1
2
3
4
5
        // 削除時にs3のバケットも削除する
        _ = new Bucket(this, "WorkshopBucket", new BucketProps
        {
            RemovalPolicy = RemovalPolicy.DESTROY
        });

CLI

Session Managerでのポートフォワーディング, リモートホストへの接続

1
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>はエンドポイント名を入れればよい.
1
2
3
4
5
6
7
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
1
2
3
4
5
6
7
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 バケット作成

  • 東京リージョンはap-northeast-1
1
2
3
4
aws s3api create-bucket \
--bucket <bucket-name> \
--region <region-name> \
--create-bucket-configuration LocationConstraint=<region-name>

アクセスキー取得

  • 参考: CloudShellを使うとローカルの設定なしでAWS CLIが使えるので必要に応じて使い分けよう
  • IAMユーザーのアクセスキーの管理
  • アクセスキーとシークレットキーをCSVで取得, メモ
  • 次のコマンド実行
1
2
3
4
aws configure

Default region name [None]: ap-northeast-1
Default output format [None]: json
  • 上記設定は~/.aws/configに次のように記録される
1
2
3
[default]
region = ap-northeast-1
output = json
  • ~/.aws/credentialsaws_access_key_idaws_secret_access_keyが記録される

アカウント確認

  • 下記のどちらかを実行する
1
2
aws sts get-caller-identity
aws configure list
  • ~/.aws/cli/aliaswhoamiとして登録しておくとよい.
1
2
[toplevel]
whoami = sts get-caller-identity

アカウント切り替え

1
2
aws configure list
export AWS_DEFAULT_PROFILE=<USER_NAME>

アカウント登録

  • 事前にAWSにアクセスしてIAMからアクセスキー・シークレットアクセスキーのCSVをダウンロードしておくこと
    • ~/.awsにでも置いておくとよい
  • 特に希望がない場合のリージョンとフォーマット
    • リージョン: ap-northeast-1
    • フォーマット: json
1
2
aws configure --profile <username>
cat ~/.aws/credentials

ページャーを発動させないオプション--no-cli-pager

タイトル通り--no-cli-pagerをつければよい.

補完設定

CloudFormation

ドリフトの検出と解決

  • 実体とスタックの乖離をドリフトと呼ぶ
  • インポートで実体をスタックに取り込める

DynamoDB

参考文献

参考: Amazon DynamoDB Labs

1
curl -sL https://amazon-dynamodb-labs.com/static/game-player-data/battle-royale.tar | tar -xv

DynamoDB Local

モデリング例

  • MicrosoftNorthwindDynamoDBでモデル化: URL
  • 階層構造を持つ場合の例: Hierarchical Data

ECR

M1 Macx86_64ビルドしてプッシュする

  • ECRのコンソールにアクセスする.
  • 適切なイメージを選ぶ.
  • 画面上部の「プッシュコマンドの表示」をクリックする.
  • モーダル中のコマンドを順に熟考すればよい.
  • x86_64ビルドコマンドはDockerを参照すること.

MacError 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.jsoncredsStoredesktopだったのをosxkeychainにしたら通った

IAM

AdministratorAccess権限を与えたい

  • 「アクセス権限の追加」をクリック
  • 「既存のポリシーを直接アタッチ」をクリック
  • 「ポリシー名」を選ぶ

MFA設定 機種変更時にMFA端末を変更

ユーザー作成

ルートアカウントへのMFAを複数人に展開

  • ルートアカウントのMFAを複数設定できるようになったため, 実際に複数人に設定してもらい, 適切な権限を持つ人にルートアカウントを触れるようにしたい.
  • MFA設定
    • IAMの画面にアクセスしてから画面右の「クイックリンク > 自分の認証情報」リンクから画面遷移する.
    • その画面でQRコード読み取りして設定できる.
  • 対処1: リアルで複数名が集まれる
    • このときは既にルートアカウントにアクセスできる人が実際にIAM画面にアクセスし, MFA設定のQRコード読み取り部分をその人の画面から設定して試せばよい.
  • 対処2: リモートで対応したい.
    • ルートアカウントの情報は適切な形で共有してあり, 複数名がMFA以外の情報にはアクセスできるとする.
    • MFA認証のところまでログインを進める.
    • MFA認証できる人にネット上で依頼してMFAコードを送ってもらう.
    • ログインしてもらったあと, その人が対応しやすいMFA設定をしてもらう.

ロールのリスト取得

1
aws iam list-roles

MFA デバイス解除

Lambda

公式デベロッパーガイド

Route 53

ドメイン登録

  • Route 53でドメインを設定する
  • コンソールでRoute 53のホストゾーンにアクセスする
  • コンソールからメールを送ってホストゾーンを認証する

HTTPS用のドメイン登録

  • 参考
    • サンプルドメインはphasetr.comとする.
  • ACM(Certificate Manager)からパプリック証明書をリクエストする
    • 完全修飾ドメインにはphasetr.com*.phasetr.comを指定する
  • 進んだ画面で「Route 53でレコードを作成」をクリックして設定
  • 必要に応じて時間を置いてから証明書のステータスが発行済みになるか確認
  • HostedZoneの名前を適切に設定した上で以下のコマンドで登録されているか確認する。
1
2
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のアクセスキー・シークレットキーを使う.