あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

S3バケットをほかアカウントで作成すると時間がかかる件


事象

S3バケットを作成したが、違うアカウントに作り直しする場合、バケットを削除後別のアカウントでは即時作成できず時間がかかる。リージョン違いでも起きる模様。同一アカウント同一リージョンでは即時作成可能

原因

名前空間はすべての AWS アカウントで共有されるため、バケット名はグローバルに一意である必要があります。Amazon S3 は大規模な分散システムであるため、バケットの削除などの変更は、すべての AWS リージョンで結果整合性が取れるまでに時間がかかる場合があります。
repost.aws

※1~2時間かかる模様

やったこと

1.アカウント1で[test-123456789999]を作成

2.アカウント1で[test-123456789999]を削除

3.アカウント2で[test-123456789999]を作成


 ※エラーが発生

A conflicting conditional operation is currently in progress against this resource. Please try again.



感想

あんまり同じ名前のバケットを別のアカウントで作成する機会がなかったので気が付かなかった・・・

Amazon EventBridgeの入力トランスフォーマーで通知メールの本文をカスタマイズしてみた


やること

下記のCloudTrail Insightsの通知メールをカスタマイズする。
AWS CloudTrail Insightsを使ってみた - あめがえるのITブログ

実践!

1.作成済みのEventBridgeルールに入力トランスフォーマーを設定
1-1.[AWS] - [EventBridge] - [ルール]

1-2.作成済みのEventBridgeルールを選択

1-3.[ターゲット]タブ

1-4.[編集]

1-5.[追加設定]のプルダウンを開き、[ターゲット入力を設定]から[入力トランスフォーマー]を選択

1-6.[入力トランスフォーマーを設定]

1-7.[入力パス]と[テンプレート]に下記を入力
 ※CloudTrail Insightsのイベント内容のサンプルを見たい場合は、[サンプルイベント]から[CloudTrail Insights]を選択

入力パス
 ※イベントを変数に格納するイメージ
 ※キー名に[.(ドット)]は使用不可

{
    "version": "$.version",
    "id": "$.id",
    "detail-type": "$.detail-type",
    "source": "$.source",
    "account": "$.account",
    "time": "$.time",
    "region": "$.region",
    "resources": "$.resources",
    "eventVersion": "$.detail.eventVersion",
    "eventTime": "$.detail.eventTime",
    "awsRegion": "$.detail.awsRegion",
    "eventID": "$.detail.eventID",
    "eventType": "$.detail.eventType",
    "recipientAccountId": "$.detail.recipientAccountId",
    "sharedEventID": "$.detail.sharedEventID",
    "insightDetails_state": "$.detail.insightDetails.state",
    "insightDetails_eventSource": "$.detail.insightDetails.eventSource",
    "insightDetails_eventName": "$.detail.insightDetails.eventName",
    "insightDetails_insightType": "$.detail.insightDetails.insightType",
    "baseline_average": "$.detail.insightDetails.insightContext.statistics.baseline.average",
    "insight_average": "$.detail.insightDetails.insightContext.statistics.insight.average",
    "insightDuration": "$.detail.insightDetails.insightContext.statistics.insightDuration",
    "eventCategory": "$.detail.eventCategory"
}

テンプレート
 ※ダブルクォーテーションは必須

"メッセージもかけるよ!"
"version:<version>"
"id:<id>"
"detail-type:<detail-type>"
"source:<source>"
"account:<account>"
"time:<time>"
"region:<region>"
"resources:<resources>"
"detail.eventVersion:<eventVersion>"
"detail.eventTime:<eventTime>"
"detail.awsRegion:<awsRegion>"
"detail.eventID:<eventID>"
"detail.eventType:<eventType>"
"detail.recipientAccountId:<recipientAccountId>"
"detail.sharedEventID:<sharedEventID>"
"detail.insightDetails.state:<insightDetails_state>"
"detail.insightDetails.eventSource:<insightDetails_eventSource>"
"detail.insightDetails.eventName:<insightDetails_eventName>"
"detail.insightDetails.insightType:<insightDetails_insightType>"
"baseline.average:<baseline_average>"
"insight.average:<insight_average>"
"insightDuration:<insightDuration>"
"eventCategory:<eventCategory>"

1-8.[ルールを更新]

2.動作確認
2-1.イベントを発行しメールを送信させる
2-2.メールの本文がテンプレート通りになっていること

感想

メールタイトルも変えれればいいのにな。あとはLambdaをかませるほかなさそう。。。

AWS CDK環境を作成し、S3バケットを作ってみた


やること

AWS CDKを利用するために必要なnode.jsとcdkコマンドのインストールを行う。

前提

Windows11 Powershellで実施
サンプルでTypeScriptを使用し、S3バケットを作成

実践!

1.node.jsインストール
1-1.下記へアクセスし、Node.jsをダウンロード
1-2.ダウンロードしたファイルを実行
1-3.PowerShellを開き、下記を実行

> node --version
v18.16.0


2.cdkインストール
2-1.PowerShellを開き、下記を実行

> npm install -g aws-cdk
added 1 package in 12s

2-2.下記を実行し、cdkがインストールされていることを確認

> cdk --version
2.146.0 (build b368c78)


3.AWS CDKでS3バケットを作成
3-1.下記を実行し、CDKプロジェクト用フォルダを作成

> mkdir cdk-workshop

    ディレクトリ: C:\
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/06/15     18:03                cdk-worksh
                                          
> cd cdk-workshop

3-2.下記を実行し、サンプルプロジェクトを初期化

> cdk init sample-app --language typescript

Applying project template sample-app for typescript
# Welcome to your CDK TypeScript project

You should explore the contents of this project. It demonstrates a CDK app with an instance of a stack (`CdkWorkshopStack`)
which contains an Amazon SQS queue that is subscribed to an Amazon SNS topic.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

* `npm run build`   compile typescript to js
* `npm run watch`   watch for changes and compile
* `npm run test`    perform the jest unit tests
* `cdk deploy`      deploy this stack to your default AWS account/region
* `cdk diff`        compare deployed stack with current state
* `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
✅ All done!

3-3.下記を実行し、S3バケット作成に必要な依存関係をインストール

> npm install @aws-cdk/aws-s3
npm WARN deprecated @aws-cdk/cx-api@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html
npm WARN deprecated @aws-cdk/cloud-assembly-schema@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html
npm WARN deprecated @aws-cdk/core@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html
npm WARN deprecated @aws-cdk/region-info@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html
npm WARN deprecated @aws-cdk/aws-kms@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html
npm WARN deprecated @aws-cdk/aws-events@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html
npm WARN deprecated @aws-cdk/aws-s3@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html
npm WARN deprecated @aws-cdk/aws-iam@1.204.0: AWS CDK v1 has reached End-of-Support on 2023-06-01.
npm WARN deprecated This package is no longer being updated, and users should migrate to AWS CDK v2.
npm WARN deprecated
npm WARN deprecated For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html

added 13 packages, and audited 370 packages in 13s

34 packages are looking for funding
  run `npm fund` for details

8 moderate severity vulnerabilities

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

3-4.下記を実行し、サンプル用TypeScriptファイルを編集

> vim lib/cdk-workshop-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

export class CdkWorkshopStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // S3バケットの作成
    new s3.Bucket(this, 'MyBucket', {
      bucketName: 'my-unique-bucket-name-12345618181818181', // 重複しないS3バケット名を指定
      versioned: true,  // バージョニングを有効にする
      removalPolicy: cdk.RemovalPolicy.DESTROY,  // スタックの削除時にバケットを削除する
      autoDeleteObjects: true,  // バケットの削除時にオブジェクトも削除する
    });
  }
}

3-5.下記を実行し、エントリーポイントファイルを編集

> vim bin/cdk-workshop.ts
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { CdkWorkshopStack } from '../lib/cdk-workshop-stack';

const app = new cdk.App();
new CdkWorkshopStack(app, 'CdkWorkshopStack');

3-6.下記を実行し、TypeScriptをビルド

> npm run build
cdk-workshop@0.1.0 build
>tsc

3-7.下記を実行し、CDKをデプロイ

> cdk deploy

✨  Synthesis time: 7.16s

CdkWorkshopStack:  start: Building 1d52cf2c4c14563d12ca62e769f1707a994e8ec19decfeba3fa09acc5394cf03:current_account-current_region
CdkWorkshopStack:  success: Built 1d52cf2c4c14563d12ca62e769f1707a994e8ec19decfeba3fa09acc5394cf03:current_account-current_region
CdkWorkshopStack:  start: Publishing 1d52cf2c4c14563d12ca62e769f1707a994e8ec19decfeba3fa09acc5394cf03:current_account-current_region
CdkWorkshopStack:  success: Published 1d52cf2c4c14563d12ca62e769f1707a994e8ec19decfeba3fa09acc5394cf03:current_account-current_region
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:

IAM Statement Changes
┌───┬────────────────────────┬────────┬────────────────────────┬──────────────────────────┬───────────┐
│   │ Resource               │ Effect │ Action                 │ Principal                │ Condition │
├───┼────────────────────────┼────────┼────────────────────────┼──────────────────────────┼───────────┤
│ + │ ${Custom::S3AutoDelete │ Allow  │ sts:AssumeRole         │ Service:lambda.amazonaws │           │
│   │ ObjectsCustomResourceP │        │                        │ .com                     │           │
│   │ rovider/Role.Arn}      │        │                        │                          │           │
├───┼────────────────────────┼────────┼────────────────────────┼──────────────────────────┼───────────┤
│ + │ ${MyBucket.Arn}        │ Allow  │ s3:DeleteObject*       │ AWS:${Custom::S3AutoDele │           │
│   │ ${MyBucket.Arn}/*      │        │ s3:GetBucket*          │ teObjectsCustomResourceP │           │
│   │                        │        │ s3:List*               │ rovider/Role.Arn}        │           │
│   │                        │        │ s3:PutBucketPolicy     │                          │           │
└───┴────────────────────────┴────────┴────────────────────────┴──────────────────────────┴───────────┘
IAM Policy Changes
┌───┬────────────────────────────────────────────────┬────────────────────────────────────────────────┐
│   │ Resource                                       │ Managed Policy ARN                             │
├───┼────────────────────────────────────────────────┼────────────────────────────────────────────────┤
│ + │ ${Custom::S3AutoDeleteObjectsCustomResourcePro │ {"Fn::Sub":"arn:${AWS::Partition}:iam::aws:pol │
│   │ vider/Role}                                    │ icy/service-role/AWSLambdaBasicExecutionRole"} │
└───┴────────────────────────────────────────────────┴────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Do you wish to deploy these changes (y/n)? y
CdkWorkshopStack: deploying... [1/1]
CdkWorkshopStack: creating CloudFormation changeset...
CdkWorkshopStack | 0/7 | 15:50:57 | REVIEW_IN_PROGRESS   | AWS::CloudFormation::Stack  | CdkWorkshopStack User Initiated
CdkWorkshopStack | 0/7 | 15:51:04 | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack  | CdkWorkshopStack User Initiated
CdkWorkshopStack | 0/7 | 15:51:07 | CREATE_IN_PROGRESS   | AWS::IAM::Role              | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092)
CdkWorkshopStack | 0/7 | 15:51:07 | CREATE_IN_PROGRESS   | AWS::CDK::Metadata          | CDKMetadata/Default (CDKMetadata)
CdkWorkshopStack | 0/7 | 15:51:07 | CREATE_IN_PROGRESS   | AWS::S3::Bucket             | MyBucket (MyBucketF68F3FF0)
CdkWorkshopStack | 0/7 | 15:51:08 | CREATE_IN_PROGRESS   | AWS::CDK::Metadata          | CDKMetadata/Default (CDKMetadata) Resource creation Initiated
CdkWorkshopStack | 1/7 | 15:51:08 | CREATE_COMPLETE      | AWS::CDK::Metadata          | CDKMetadata/Default (CDKMetadata)
CdkWorkshopStack | 1/7 | 15:51:08 | CREATE_IN_PROGRESS   | AWS::IAM::Role              | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092) Resource creation Initiated
CdkWorkshopStack | 1/7 | 15:51:09 | CREATE_IN_PROGRESS   | AWS::S3::Bucket             | MyBucket (MyBucketF68F3FF0) Resource creation Initiated
CdkWorkshopStack | 2/7 | 15:51:25 | CREATE_COMPLETE      | AWS::IAM::Role              | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092)
CdkWorkshopStack | 3/7 | 15:51:33 | CREATE_COMPLETE      | AWS::S3::Bucket             | MyBucket (MyBucketF68F3FF0)
CdkWorkshopStack | 3/7 | 15:51:34 | CREATE_IN_PROGRESS   | AWS::Lambda::Function       | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F)
CdkWorkshopStack | 3/7 | 15:51:35 | CREATE_IN_PROGRESS   | AWS::S3::BucketPolicy       | MyBucket/Policy (MyBucketPolicyE7FBAC7B)
CdkWorkshopStack | 3/7 | 15:51:36 | CREATE_IN_PROGRESS   | AWS::Lambda::Function       | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) Resource creation Initiated
CdkWorkshopStack | 3/7 | 15:51:36 | CREATE_IN_PROGRESS   | AWS::S3::BucketPolicy       | MyBucket/Policy (MyBucketPolicyE7FBAC7B) Resource creation Initiated
CdkWorkshopStack | 4/7 | 15:51:37 | CREATE_COMPLETE      | AWS::S3::BucketPolicy       | MyBucket/Policy (MyBucketPolicyE7FBAC7B)
CdkWorkshopStack | 4/7 | 15:51:37 | CREATE_IN_PROGRESS   | AWS::Lambda::Function       | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) Eventual consistency check initiated
CdkWorkshopStack | 5/7 | 15:51:42 | CREATE_COMPLETE      | AWS::Lambda::Function       | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F)
CdkWorkshopStack | 5/7 | 15:51:43 | CREATE_IN_PROGRESS   | Custom::S3AutoDeleteObjects | MyBucket/AutoDeleteObjectsCustomResource/Default (MyBucketAutoDeleteObjectsCustomResource2C28D565)
CdkWorkshopStack | 5/7 | 15:51:45 | CREATE_IN_PROGRESS   | Custom::S3AutoDeleteObjects | MyBucket/AutoDeleteObjectsCustomResource/Default (MyBucketAutoDeleteObjectsCustomResource2C28D565) Resource creation Initiated
CdkWorkshopStack | 6/7 | 15:51:45 | CREATE_COMPLETE      | Custom::S3AutoDeleteObjects | MyBucket/AutoDeleteObjectsCustomResource/Default (MyBucketAutoDeleteObjectsCustomResource2C28D565)
CdkWorkshopStack | 7/7 | 15:51:46 | CREATE_COMPLETE      | AWS::CloudFormation::Stack  | CdkWorkshopStack

 ✅  CdkWorkshopStack

✨  Deployment time: 51.79s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/CdkWorkshopStack/c8e47780-2bac-11ef-8ea6-06e695c8199b

✨  Total time: 58.95s

3-8.下記を実行し、S3バケットが作成されていることを確認

> aws s3 ls
2024-06-16 15:51:37 my-unique-bucket-name-1234561818181818181


4.後片付け
4-1.下記を実行し、スタックとS3バケットを削除

> cdk destroy
Are you sure you want to delete: CdkWorkshopStack (y/n)? y
CdkWorkshopStack: destroying... [1/1]
CdkWorkshopStack |   0 | 15:54:28 | DELETE_IN_PROGRESS   | AWS::CloudFormation::Stack  | CdkWorkshopStack User Initiated
CdkWorkshopStack |   0 | 15:54:30 | DELETE_IN_PROGRESS   | AWS::CDK::Metadata          | CDKMetadata/Default (CDKMetadata)
CdkWorkshopStack |   0 | 15:54:30 | DELETE_IN_PROGRESS   | Custom::S3AutoDeleteObjects | MyBucket/AutoDeleteObjectsCustomResource/Default (MyBucketAutoDeleteObjectsCustomResource2C28D565)
CdkWorkshopStack |   1 | 15:54:31 | DELETE_COMPLETE      | AWS::CDK::Metadata          | CDKMetadata/Default (CDKMetadata)
CdkWorkshopStack |   2 | 15:54:33 | DELETE_COMPLETE      | Custom::S3AutoDeleteObjects | MyBucket/AutoDeleteObjectsCustomResource/Default (MyBucketAutoDeleteObjectsCustomResource2C28D565)
CdkWorkshopStack |   2 | 15:54:34 | DELETE_IN_PROGRESS   | AWS::Lambda::Function       | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F)
CdkWorkshopStack |   2 | 15:54:34 | DELETE_IN_PROGRESS   | AWS::S3::BucketPolicy       | MyBucket/Policy (MyBucketPolicyE7FBAC7B)
CdkWorkshopStack |   3 | 15:54:35 | DELETE_COMPLETE      | AWS::S3::BucketPolicy       | MyBucket/Policy (MyBucketPolicyE7FBAC7B)
CdkWorkshopStack |   4 | 15:54:37 | DELETE_COMPLETE      | AWS::Lambda::Function       | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F)
CdkWorkshopStack |   4 | 15:54:37 | DELETE_IN_PROGRESS   | AWS::S3::Bucket             | MyBucket (MyBucketF68F3FF0)
CdkWorkshopStack |   4 | 15:54:37 | DELETE_IN_PROGRESS   | AWS::IAM::Role              | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092)
CdkWorkshopStack |   5 | 15:54:39 | DELETE_COMPLETE      | AWS::S3::Bucket             | MyBucket (MyBucketF68F3FF0)

 ✅  CdkWorkshopStack: destroyed

4-2.下記を実行し、S3バケットが削除されていることを確認

> aws s3 ls
 



感想

テンプレートをS3にアップロードしなくてもいいのでCloudFormationより楽な気がする。TypeScript勉強しないと。。。

AWS CloudTrail Insightsを使ってみた


CloudTrail Insightsとは

アカウント内のAPIアクティビティを記録し、通常と異なる動作を検知しログ出力からSNSなどと連携して通知を行える。
グローバルではなく1つのリージョンで発生するイベントを分析する。

通常と異なるとは

過去データを通常とし、現在発生したAPIイベントと比較する。

GuardDutyとの違い

 目的:
  CloudTrail Insights:クラウド環境における異常なAPIアクティビティの検出
  GuardDuty:クラウド環境における脅威検出
 機能:
  CloudTrail Insights:CloudTrailのデータを分析し、通常の動作から外れる異常なAPIコールパターンを特定する。これには、異常に高いリソース作成や削除、急激な権限変更などが含まれる。
  GuardDuty:機械学習や異常検出技術を用いて、AWSアカウント内の潜在的な脅威をリアルタイムで検出する。ネットワークアクティビティ、AWS管理コンソールへの不正アクセス、IAM権限の不正使用などの異常を検出する。
 データソース:
  CloudTrail Insights:AWS CloudTrailログ
  GuardDuty:VPC Flow Logs、AWS CloudTrail、DNSログなど
 主な用途:
  CloudTrail Insights:異常なAPIアクティビティの検出、運用上の問題のトラブルシューティングセキュリティインシデントの発見
  GuardDuty:自動脅威検出、セキュリティイベントの監視、異常行動の分析

やること

CloudTrail Insightsを有効化し、EventBridgeでログを検知し、SNSでメールを通知する。

前提

CloudTrailの証跡が作成されていること。
※作成されていない場合下記を実施する。
AWS CloudTrail 証跡を有効化してみた - あめがえるのITブログ
通知用SNSトピックを作成していること。

実践!

1.CloudTrail Insights有効化
1-1.[AWS] - [CloudTrail]

1-2.[証跡] - 証跡を選択

1-3.Insightsイベントの[編集]

1-4.下記をチェック
 Insights イベント:✅
 API コールレート:✅
 API エラー率:✅

1-5.[変更の保存]

2.EventBridge設定
2-1.[AWS] - [EventBridge] - [ルール]

2-2.[ルールを作成]

2-3.下記を選択
 名前:ルール名
 説明 - オプション:任意
 イベントパス:default
 選択したイベントパスでルールを有効にする:✅
 ルールタイプ:イベントパターンを持つルール:✅

2-4.[次へ]

2-5.下記を選択
 イベントソース:その他
 メソッド:カスタムパターン(JSONエディタ)
 イベントパターン:

{
  "detail": {
    "eventType": ["AwsCloudTrailInsight"]
  }
}



2-6.[次へ]

2-7.下記を選択
 ターゲットタイプ:AWSのサービス
 ターゲットを選択:SNS トピック
 トピック:事前に作成しているSNSトピック

2-8.[次へ]

2-9.[次へ]

2-10.[ルールの作成]

3.動作確認
3-1.CloudShellで通常では発生しないAPIを発生させる
 3-1-1.[CloudShell]
 3-1-2.下記を実行
  ※存在しないEC2インスタンスの詳細を10回確認する

for i in {1..10}; do aws ec2 describe-instances --instance-ids i-xxxxxxxxxx; done


 3-1-3.APIレート異常のメールを受信すること
  ※設定を有効にしてから通知されるまで最大36時間かかるので気長に待ちましょう。
  ※下記が受信するメール。分かりづらいので後でカスタマイズします。

3-2.CloudTrail Insightsイベント確認
 ※詳細はこちらのほうが見やすい
 3-2-1.[AWS] - [CloudTrail] - [Insights]



感想

よほど安定している本番環境などにはよさどうだが検証・開発環境などのよく操作される環境では誤検知が多そう。

Amazon Athenaでワークグループを作成してみた


Athenaワークグループとは

ユーザー、チーム、アプリケーション、またはワークロードを分離し、各クエリまたはワークグループ全体で処理できるデータ量に制限を設定して、コストを追跡ができる。
docs.aws.amazon.com

やること

  • Athenaでワークグループを作成し、検索容量制限を設定して、超過した場合にメールを通知させる。
  • Primaryのワークグループを無効化する。

前提

動作確認のためクエリが実行できる状態になっていること。
※実行準備ができていない場合下記を行う。
AWS Glueを使ってS3にあるデータをAthenaで検索してみた - あめがえるのITブログ

実践!

1.ワークグループ作成
1-1.[AWS] - [Athena]

1-2.[管理] - [ワークグループ]

1-3.[ワークグループを作成]

1-4.下記を入力
 ワークグループ名:ワークグループ名
 説明 - オプション:任意
 エンジンタイプ:Athena SQL
 クエリエンジンをアップグレード:自動
 認証:AWS Identity and Access Management (IAM)
 クエリ結果の場所 - オプション:任意のS3バケット
 AWS CloudWatchにクエリメトリクスを発行:✅
 データ制限:10 Megabytes MB
  ※10MB~7EB間で設定。KBは指定できないのにプルダウンの選択肢にあるのが謎。。。
 アラート1:データしきい値:10 Kilobytes KB
 期間:1分
 SNS トピックを選択:任意のSNSトピック
  ※適当なSNSトピックがない場合[SNS トピックを作成]から[スタンダード]で作成しサブスクリプションも作成する。
   Subscribeのメールが届くため、[Confirm subscription]をクリックする。


1-5.[ワークグループを作成]

2.動作確認
2-1.クエリを検索し、メールで超過通知が行われること
 2-1-1.[Athena] - [クエリエディタ]

 2-1-2.ワークグループを作成したワークグループに変更

 2-1-3.適当なクエリを実行
  ※少し大き目のクエリ結果のものを実行する

  ※スキャンしたデータが10kbを超えること

 2-1-4.メールを受信すること

3.Primaryオフ
※primaryのワークグループで検索されないようにオフにする
3-1.ワークグループで[primary]を選択

3-2.[ワークグループをオフにする]

3-3.[オフにする]


感想

暑くなってきた。やる気がでない。。。

AWS Glueを使ってS3にあるデータをAthenaで検索してみた

Glueを使う理由

Athenaで検索する場合、データベースを作成する必要があるがAthenaだけで行うと手動で設定する必要があり手間。Glueを使うと自動でカラム情報取得しデータベースを作成してくれるため便利。

やること

GlueでS3のデータカタログを作成し、Athenaで検索する

前提

S3はCloudTrailの証跡を使用する。
※ログ系のデータが格納されているS3バケットであればなんでも可
 適当なバケットがない場合、下記を参考にCloudTrailの証跡を作成する
AWS CloudTrail 証跡を有効化してみた - あめがえるのITブログ

実践!

1.Glue Crawler作成
1-1.[AWS] - [Glue]

1-2.[Data Catalog] - [Crawlers]

1-3.[Create crawler]

1-4.下記を入力
 Name:crawler名
 Description:任意

1-5.[Next]

1-6.下記を選択
 Is your data already mapped to Glue tables?:Not yet

1-7.[Add data source]

1-8.下記を入力
 Data source:S3
 Network connection - optional:空白
 Location of s3 data:in this account
 S3 path:s3://aws-cloudtrail-logs-xxxxxx
 Subsequent crawler runs:Crawl all sub-folders

1-9.[Add an S3 data source]

1-10.[Create new IAM role]

1-11.適当な作成するIAMRole名を入力

1-12.[Create]

1-13.[Next]

1-14.[Add database]

1-15.下記を入力
 Name:database名
 Description - optional:任意
 Location - optional:任意

1-16.[Create database]

1-17.[Next]

1-18.[Create crawler]


2.GlueでGrawlerを実行
2-1.作成したCrawlerを選択し、[Run crawler]

2-2.下記を入力
 Name:Crawler名
 Description - optional:任意

2-3.[Next]

2-4.Crawler runsの[Last run]が[Succeeded]になることを確認

2-5.[Databases] - [Tables]

2-6.S3内のフォルダ情報が表示されていること


3.Athenaクエリ保存用S3バケット作成
3-1.[AWS] - [S3]

3-2.[バケットを作成]

3-3.下記を入力
 バケット名:任意

3-4.[バケットを作成]


4.Athena設定
4-1.[AWS] - [Athena] - [クエリエディタ]

4-2.[設定] - [管理]

4-3.下記を入力
 Location of query result - optional:項番3で作成したS3バケット

4-4.[保存]


5.Athena検索
5-1.[AWS] - [Athena] - [クエリエディタ]

5-2.下記を選択
 データソース:AwsDataCatalog
 データベース:作成したデータベース

5-3.テーブル名の[…] - [テーブルをプレビュー]

5-4.[結果]にクエリ結果が表示されることを確認



感想

たかだかS3の検索だけなのに結構手間だなと感じた。。。

AWS AmplifyのBackend(Cognito)を作成してみた

やること

AmplifyでCognitoを作成する

前提

コマンド実行環境はWindows11を使用する

実践!

1.Cognito作成
1-1.PowerShellを実行
1-2.Amplifyのローカルフォルダに移動
1-3.下記を実行

> ampllify add auth

※すべてデフォルトを指定

> amplify add auth
Using service: Cognito, provided by: awscloudformation

 The current configured provider is Amazon Cognito.

 Do you want to use the default authentication and security configuration? Default configuration
 Warning: you will not be able to edit these selections.
 How do you want users to be able to sign in? Username
 Do you want to configure advanced settings? No, I am done.
✅ Successfully added auth resource amplify5236b512 locally

✅ Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud

1-4.下記を実行

> amplify push
> amplify push
√ Successfully pulled backend environment dev from the cloud.

    Current Environment: dev

┌──────────┬─────────────────┬───────────┬───────────────────┐
│ Category │ Resource name   │ Operation │ Provider plugin   │
├──────────┼─────────────────┼───────────┼───────────────────┤
│ Auth     │ amplify5236b512 │ Create    │ awscloudformation │
├──────────┼─────────────────┼───────────┼───────────────────┤
│ Function │ amplify6d148998 │ No Change │ awscloudformation │
├──────────┼─────────────────┼───────────┼───────────────────┤
│ Api      │ api9bb60a4c     │ No Change │ awscloudformation │
├──────────┼─────────────────┼───────────┼───────────────────┤
│ Storage  │ dynamo3c6a94e5  │ No Change │ awscloudformation │
└──────────┴─────────────────┴───────────┴───────────────────┘
√ Are you sure you want to continue? (Y/n) · yes

Deployment completed.
Deploying root stack amplify [ ================================-------- ] 4/5
        amplify-amplify-dev-5fd03      AWS::CloudFormation::Stack     UPDATE_IN_PROGRESS             Sun Jun 09 2024
        storagedynamo3c6a94e5          AWS::CloudFormation::Stack     UPDATE_COMPLETE                Sun Jun 09 2024
        functionamplify6d148998        AWS::CloudFormation::Stack     UPDATE_COMPLETE                Sun Jun 09 2024
        apiapi9bb60a4c                 AWS::CloudFormation::Stack     UPDATE_COMPLETE                Sun Jun 09 2024
        authamplify5236b512            AWS::CloudFormation::Stack     CREATE_COMPLETE                Sun Jun 09 2024
Deployed auth amplify5236b512 [ ======================================== ] 6/6
        UserPoolClientRole             AWS::IAM::Role                 CREATE_IN_PROGRESS             Sun Jun 09 2024
        UserPool                       AWS::Cognito::UserPool         CREATE_COMPLETE                Sun Jun 09 2024
        UserPoolClientWeb              AWS::Cognito::UserPoolClient   CREATE_COMPLETE                Sun Jun 09 2024
        UserPoolClient                 AWS::Cognito::UserPoolClient   CREATE_COMPLETE                Sun Jun 09 2024
        IdentityPool                   AWS::Cognito::IdentityPool     CREATE_COMPLETE                Sun Jun 09 2024
        IdentityPoolRoleMap            AWS::Cognito::IdentityPoolRol… CREATE_COMPLETE                Sun Jun 09 2024

Deployment state saved successfully.


2.作成確認
2-1.[AWS] - [Cognito] - [ユーザープール]

2-2.ユーザープールが作成されていること


感想

なるほどなるほど