コンテンツにスキップ

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

CDK アップデート

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

CDK コマンド init

1
cdk init sample-app --language csharp

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

1
cdk diff

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

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

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

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

1
cdk synth

CDK バケットの削除

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

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

CLI S3 バケット作成

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

CLI アクセスキー取得

  • 参考: 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が記録される

CLI アカウント確認

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

CLI アカウント切り替え

1
2
aws configure list
export AWS_DEFAULT_PROFILE=<USER_NAME>

CLI アカウント登録

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

Cloud9 GitHub連携

  • 参考
  • 次のコマンドでSSH鍵を作成
1
2
3
cd ~/.ssh
ssh-keygen
less ~/.ssh/id_rsa.pub
  • GitHubに公開鍵を登録
  • リポジトリ作成
  • git pullしてコミット・プッシュ
  • push/pullについて詳しくは都度ググる

Cloud9 VSCodeでのSSH設定

VSCode参照.

Cloud9 コンソールでサービスを立ち上げたあとにブラウザで確認

  • 参考
    • Preview (プレビュー) > Preview Running Application (実行中のアプリケーションのプレビュー)
    • エディタに出てきたタブの右上, 四角の中に右上矢印があるボタンをクリック
    • ブラウザの別タブで画面が開く

CloudFormation ドリフトの検出と解決

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

Copilot 公式ドキュメント

Copilot アカウント選択

  • copilot env initを実行するとそのappに紐づけるアカウント(profile)が設定できる

Copilot アカウント内に作成されたApplicationの一覧を確認したい

  • copilot app ls
  • 現在のアカウント・リージョン内にある全てのApplicationを確認

Copilot Applicationに含まれる対象を確認したい

  • copilot app show
  • Application内のServiceEnvironmentを含んだサマリ情報を表示

Copilot app init --domainのための事前設定

  • URL
  • Route 53コンソールからホストゾーンを新たに作る
  • 4つのNSレコードをAWSコンソールからコピー
  • 適切なレジストラのページに移動して4つのカスタムネームサーバーを張りつける
    • お名前.comでは次の通り: 参考
    • トップメニュー「ドメイン設定」を選ぶ
    • 左メニュー「ネームサーバーの設定 > ネームサーバーの変更」を選ぶ.
    • 適切なドメインを選択してチェックを入れる
    • 「他のネームサーバーを利用」タブを選ぶ.
    • AWSコンソールで表示されたネームサーバー情報を入力する.

Copilot Environmentの作成

  • copilot env init

Copilot Environmentのデプロイ

  • 必要に応じて手動でcopilot/environments/[env name]/manifest.ymlを修正する
  • copilot env deploy

Copilot healthcheck

1
2
3
4
5
6
7
8
  healthcheck:
    path: "/health"
    healthy_threshold: 2
    unhealthy_threshold: 2
    interval: 10s
    timeout: 5s
    grace_period: 60s
  deregistration_delay: 60s

Copilot init中にターミナルが死んで再作成・削除できなくなったとき

  • 別のアプリを作ってみる.
  • 作ったときに出てくるメッセージをもとにAWSコンソールからサービスを確認する.
  • 作ったアプリに対するモノが何かできているはずで, それを直接削除する.
    • 例えばCloudFormationのスタックができているはずだから, それを削除する.

Copilot pipelineによるマイグレーション

Copilot Load Balanced Web Serviceのプロパティのリスト

  • どこにあるかすぐ忘れるため記録
  • manifestにある

Copilot Load Balanced jobでデータベースをマイグレーションしたい

  • AWSコンソールでSecrets Managerにアクセスする
  • 対応するRDS用のシークレットの名前を控える
  • jobymlsecretsに次のように設定する
    • secretsmanagerの値は控えた値を書く
1
2
3
secrets:
  CLUSTER_SECRET:
    secretsmanager: 'mydjangodbAuroraSecret-ObSZ2fGHWHTm'

Copilot Request Driven jobでデータベースをマイグレーションしたい

  • copilot svc showでデータベース接続用情報を持つSECRET ARNの値を確認する.
  • copilot job initで適切に設定する
  • ymlを編集する
    • schedulenoneにする
    • シークレット変数を追加する.
1
2
3
secrets:
  # 変数名と値は`copilot svc show`の値を指定する
  WEBCLUSTER_SECRET_ARN: "arn:aws:secretsmanager:us-west-2:573143736992:secret:webclusterAuroraSecret-5ggcmKflNSGA-UR8O44"
  • copilot job deployする
  • copilot job runのあとCloudWatchのログを確認する

C#の参考プログラム

1
dotnet add package AWSSDK.SecretsManager.Caching
 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
using System.Text.Json;
using Amazon.SecretsManager.Extensions.Caching;
using CopilotRequestDriven.Models;

namespace CopilotRequestDriven.Services;

public class DbConnectionStringService
{
    public async Task<string> GetConnectionString(string secretArn)
    {
        var cache = new SecretsManagerCache();
        string secretString;
        try
        {
            secretString = await cache.GetSecretString(secretArn);
            if (secretString == null)
            {
                Console.WriteLine("secretString is null");
                return "Cannot get a secret string";
            }
        }
        catch (Exception e)
        {
            // ジョブの場合は直接JSONの値が入るようでHTTPアクセスでエラーが出るため`secretArn`で置き換える
            secretString = secretArn;
        }
        Console.WriteLine($"secretString: {secretString}");
        var secret = JsonSerializer.Deserialize<AwsAuroraSecret>(secretString);
        return
            $"User ID={secret!.username};Password={secret.password};Host={secret.host};Port={secret.port};Database={secret.dbname};";
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
using HogeApp.Services;

var secretArn = Environment.GetEnvironmentVariable("WEBCLUSTER_SECRET_ARN");
var dbConnection = new DbConnectionStringService();
Console.WriteLine($"secretArn: {secretArn}");
var defaultConnection = builder.Configuration.GetConnectionString("DefaultConnection");
var connectionString = secretArn is null
    ? defaultConnection ?? "should not empty"
    : await dbConnection.GetConnectionString(secretArn);
Console.WriteLine($"Connection String: {connectionString}");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseNpgsql(connectionString));

Copilot Request Driven 2023-02-10時点でのエラー

1
2
 Proposing infrastructure changes for stack my-app-test-my-svc deploy service my-svc to environment test: deploy service: check if changeset is empty: create change set copilot-ceee385b-d1d7-4248-b4f9-a9a725daab12 for stack my-app-test-my-svc: ValidationError: Template format error: Unrecognized resource types: [AWS::AppRunner::Service]
  • 2023-02-10時点ではus-west-1ではApp Runnerが使えない模様

Copilot svc デプロイ

  • 新しいEnvironmentを作った時点でデプロイされたServiceはない.
  • デプロイしたいServiceのディレクトリからcopilot deployコマンドを実行する.
  • どのEnvironmentにデプロイしたいのか尋ねられる

Copilot svc サービスに含まれる対象を確認したい

  • copilot svc show

Copilot svc 起動中のサービス確認, copilot svc status

  • URL
  • copilot svc status

Copilot copilot svc exec

  • URL
  • Fargatedocker exec対応
  • 2023-03時点ではLoad Balancedでは使えるがApp Runnerでは使えない

Copilot CloudFormationテンプレートの出力

1
copilot svc package

Copilot pipeline

1
2
copilot pipeline init
copilot pipeline update

Copilot storage environmentごとにアクセス設定を変える

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Mappings:
  PublicAccessibilityMap:
    test:
      "publiclyAccessible": true
    prod:
      "publiclyAccessible": false
[name]DBCluster:
  Metadata:
    'aws:copilot:description': 'The testing Aurora Serverless v2 database cluster'
  Type: 'AWS::RDS::DBCluster'
  Properties:
    PubliclyAccessible: !FindInMap [PublicAccessibilityMap, !Ref Env, publiclyAccessible]

Copilot 環境変数やSecretsが反映されない

  • 2023-05-24, C#ASP.NETを使っていたときの話.
  • Dockerfilemanifest.ymlの両方でASPNETCORE_ENVIRONMENTを指定していたら, 正しく環境変数に反映されていなかった.
  • DockerfileからENV指定を削除して対応した.

Copilot 秘密の変数の指定

  • 2022-12-20 AWS Copilot with AWS CDK
  • 適切なyamlファイルにsecretsを指定する
  • 下記のように書く
    • PostgreSQLConfig__Hostは自由にしてよく, この値がコンテナに環境変数として指定される
    • AuroraSecret-ABC3G7c8bvFyP-C5JIGEcopilot svc showSecretsに表示される値から取れる
    • host::にあたる部分はAWSコンソールなどでデータベースのシークレット変数として指定されている変数名を取ればよい
1
2
3
4
5
6
7
environments:
  staging:
    image:
      build: Dockerfile.staging
    secrets:
      PostgreSQLConfig__Host:
        secretsmanager: 'AuroraSecret-ABC3G7c8bvFyP-C5JIGE:host::'

Copilot セキュリティグループを調べる

  • AWSのコンソールにアクセスする
  • VPCにアクセスする
  • ダッシュボードから「セキュリティ グループ」を選ぶ
  • 設定されたセキュリティ グループの一覧が表示されている

Copilot サービスに設定された環境変数の値を確認する

  • copilot svc showSecretsで確認できる

Copilot サービスのコンテナへのコマンド実行

1
copilot svc exec

Copilot サービスの停止・再開

1
2
3
copilot svc pause -n maitred

copilot svc resume -n maitred

Copilot ジョブ実行

1
2
copilot job run
copilot job run --name db-migrate --env staging

Copilot データベース接続: App Runner

1
2
3
network:
  vpc:
    placement: private
  • copilot storage initを実行する
  • copilot svc showでデータベース接続用のSECRET ARNの値を確認する
  • 確認した値をもとにcopilot/svc/addonsに次のような内容でiam-secrets-manager-policy.ymlを追加する
 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
Parameters:
  App:
    Type: String
    Description: Your application's name.
  Env:
    Type: String
    Description: The environment name your service, job, or workflow is being deployed to.
  Name:
    Type: String
    Description: The name of the service, job, or workflow being deployed.

Resources:
  IamSecretsManagerPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
        - Sid: ListBucketActions
          Effect: Allow
          Action:
            - secretsmanager:GetResourcePolicy
            - secretsmanager:GetSecretValue
            - secretsmanager:DescribeSecret
            - secretsmanager:ListSecretVersionIds
          Resource: "!!!取得した値で更新!!!"

Outputs:
  ListBucketPolicyArn:
    Description: "The ARN of the ManagedPolicy to attatch to the task role."
    Value: !Ref IamSecretsManagerPolicy
  • 環境変数APRDJANGOWEBCLUSTER_SECRET_ARNをもとにデータベース情報を取得するように設定する

データベース取得方法

JavaScript
  • 環境変数名は適切に設定すること
1
2
3
4
5
6
    const AWS = require('aws-sdk');
    const client = new AWS.SecretsManager({
        region: process.env.AWS_DEFAULT_REGION,
    });
    const dbSecret = await client.getSecretValue({SecretId: process.env.APRDJANGOWEBCLUSTER_SECRET_ARN}).promise();
    const {username, host, dbname, password, port} = JSON.parse(dbSecret.SecretString);
Python
  • 環境変数名は適切に設定すること
 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
import os
import json

secret_arn = os.getenv("APRDJANGOWEBCLUSTER_SECRET_ARN")
if secret_arn is None:
    print("Since `secret_arn` is None, we use sqlite!")
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    print("secret_arn is not None!")
    print(f"secret_arn: {secret_arn}")
    DBINFO = json.loads(secret_arn)
    print(f"DBINFO: {DBINFO}")

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'HOST': DBINFO['host'],
            'PORT': DBINFO['port'],
            'NAME': DBINFO['dbname'],
            'USER': DBINFO['username'],
            'PASSWORD': DBINFO['password'],
        }
    }
C#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class DbConnectionStringService
{
    public async Task<string> GetConnectionString(string secretArn)
    {
        var cache = new SecretsManagerCache();
        var secretString = await cache.GetSecretString(secretArn);
        if (secretString == null)
        {
            Console.WriteLine("secretString is null");
            return "Cannot get a secret string";
        }
        Console.WriteLine($"secretString: {secretString}");
        var secret = JsonSerializer.Deserialize<AwsAuroraSecret>(secretString);
        return
            $"User ID={secret!.username};Password={secret.password};Host={secret.host};Port={secret.port};Database={secret.dbname};";
    }
}
1
2
3
4
5
6
7
8
9
// Program.cs
var secretArn = Environment.GetEnvironmentVariable("WEBCLUSTER_SECRET_ARN");
var dbConnection = new DbConnectionStringService();
Console.WriteLine($"secretArn: {secretArn}");
var defaultConnection = builder.Configuration.GetConnectionString("DefaultConnection");
var connectionString = secretArn is null
    ? defaultConnection ?? "should not empty"
    : await dbConnection.GetConnectionString(secretArn);
Console.WriteLine($"Connection String: {connectionString}");

Copilot データベース接続: Load Balanced

  • 参考
  • copilot svc showSecretsを調べる
  • データベース用の値を控える: 例えばMYDJANGODB_SECRETなどデータベース用に設定した値_SECRETのような値になっているはず
    • これが環境変数に指定されているため使っている言語に合わせて環境変数を取得する
  • 環境変数はJSON形式の文字列だからJSONで解釈して接続文字列や接続情報を指定する
    • JSONの形式はAWSコンソールのSecrets Managerで確認できる
  • Djangoでの書き方は次の通り
    • ローカル開発やチェック用のログ出力も入れてある
 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
import os
import json

dbsecret = os.environ.get('MYDJANGODB_SECRET')
if dbsecret is None:
    print("Since `dbsecret` is None, we use sqlite!")
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    print("dbsecret is not None!")
    print(dbsecret)
    DBINFO = json.loads(dbsecret)
    print(DBINFO)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'HOST': DBINFO['host'],
            'PORT': DBINFO['port'],
            'NAME': DBINFO['dbname'],
            'USER': DBINFO['username'],
            'PASSWORD': DBINFO['password'],
        }
    }

Copilot データベース接続: マイグレーションなどでジョブからつなぐ

  • 参考
  • 基本的なデータベースまでのサービス構築は他の項目を参照すること.
  • ジョブからデータベースにつなぐにはセキュリティ設定を追加する
  • 以下の記述でファイル名・項目名は構築したサービスごとに適切に設定すること
  • 特にsvc/addons/db.ymlDBClusterSecurityGroupに次のように追記する
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  mydjangodbDBClusterSecurityGroup: # 適切な項目を選ぶ
    Metadata:
      'aws:copilot:description': 'A security group for your Aurora Serverless v2 cluster mydjangodb'
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: The Security Group for the Aurora Serverless v2 cluster.
      SecurityGroupIngress:
        - ToPort: 5432
          FromPort: 5432
          IpProtocol: tcp
          Description: !Sub 'From the Aurora Security Group of the workload ${Name}.'
          SourceSecurityGroupId: !Ref mydjangodbSecurityGroup
        - ToPort: 5432                                                                                 # ADD
          FromPort: 5432                                                                               # ADD
          IpProtocol: tcp                                                                              # ADD
          Description: 'Access to environment security group'                                          # ADD
          SourceSecurityGroupId: { 'Fn::ImportValue': !Sub '${App}-${Env}-EnvironmentSecurityGroup' }  # ADD

Copilot メタデータ

  • URL
  • System Manager Parameter Storeに保存される
  • /copilot/applications/${app_name}に保存

Copilot リソース作成

  • URL
  • addonsの形でCloudFormationテンプレートを使えばCopilotと連携できる

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

IAM AdministratorAccess権限を与えたい

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

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

IAM ユーザー作成

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

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

IAM ロールのリスト取得

1
aws iam list-roles

MFA デバイス解除

SAM APIをローカルでホストする

1
sam local start-api

SAM Create pipeline

1
sam pipeline init --bootstrap

SAM initランタイム指定

1
sam init --runtime nodejs

SAM エラーが出たとき

  • SAMはCloudFormationの拡張
  • SAMのビルドでエラーが出たときCloudFormationのログも確認しよう

SAM 公式リポジトリの実装例

SAM コンテナを使ってビルド

1
sam build --use-container

SAM 資料集

Secrets Manager 値を取る

  • 実際にコンソールでアクセスすると, 下の方にサンプルコードがある.
  • これを参考にすればよい.

アクティブなリソースの確認

請求額アラート設定

  • IAMルートユーザーでログイン
  • IAM設定画面でユーザ名をクリック
  • 表示されるメニューから「請求ダッシュボード」をクリック
  • 画面左側のメニュー一覧にある「請求設定」をクリック
  • 「コスト管理設定」の中にある「無料利用枠の使用のアラートの受信」にチェック
  • その下のEメールアドレス欄に送信先のメールアドレスを指定
  • 「請求アラートを受け取る」にチェック

請求額アラート設定: 一定の請求額を超えそうな場合にメールを受信する方法

  • AWSマネジメントコンソールを開く
  • CloudWatchを開く
  • 「バージニア北部」リージョン(us-east-1)を選択
  • 画面左側のメニュー一覧にある「アラーム」の中の「請求」をクリック
  • 初期設定と追加設定の二通りある
    • 初期設定の場合
      • この表の下部中央にある「アラームの作成」ボタンをクリック
        • 表の右上にある「アラームの作成」ボタンではない
        • 「メトリクスと条件の指定」画面でアラーム設定
    • 追加設定の場合
      • 「アラームの作成」ボタンをクリック
      • 「メトリクスの選択」ウインドウを開く
      • 「請求(Billing)」をクリック
      • 「概算合計請求金額」をクリック
      • 通過が「USD」, メトリクス名が「EstimatedCharges」の項目にチェック
      • 「メトリクスの選択」をクリック
  • 画面を下にスクロールし「条件」の欄を表示
  • 「しきい値の種類」で「静的」を選択
  • 「「EstimatedCargesが次の時…」」で「より大きい>しきい値)」を選択
  • 「…よりも」ではメールを送信してもらうための基準額をUSドルで入力
  • 入力が完了したら「次へ」ボタンをクリック
  • 以下のアクションの設定画面の「通知」欄で「このアラーム状態が以下のとき…」は「アラーム状態」を選択
  • 「SNSトピックの選択」のラジオボタンは「新しいトピックの作成」を選択
  • 「新規トピックの作成中…」の「トピック名」はデフォルトのまま
  • 「通知を受け取るEメールエンドポイント…」にアラートメールの送信先を入力
  • 「トピックの作成」ボタンをクリック
  • メールアドレスが「Eメール(エンドポイント))」に表示されていることを確認
  • 「次へ」ボタンをクリック
  • 「説明の追加」画面の名前と説明で「一意の名前を定義」欄にアラーム名を入力
    • 必要に応じて「アラームの説明」のテキストエリアに説明文を入力
  • 「次へ」ボタンをクリック
  • プレビューと作成画面が表示される
  • ここまでの入力内容に問題がないことを確認
  • 「アラームの作成」ボタンをクリック
  • アラートメールの送信先として指定したメールアドレスの受信ボックスを確認
  • AWSから届いたメールに記載された認証リンク「Confirm subscription」をクリック
  • 設定完了
  • リージョンを戻す

料金確認