AWS Developer 試験メモ

## EC2
### リンクローカルアドレス
`http://169.254.169.254/latest/meta-data/` は、AWS EC2インスタンスメタデータサービスのエンドポイントです。これは、インスタンス自身の情報（メタデータ）を取得するための仕組みとなっており、以下のような特徴があります：

- このURLは、EC2インスタンスの内部ネットワーク上からのみアクセス可能です
- 外部からはアクセスできません
- このエンドポイントを通じて以下の情報を取得できます：
  - インスタンスID
  - AMI ID
  - ホスト名やPrivate IPアドレス
  - セキュリティグループ

### リクエストに署名を含める方法
以下の2つの主要な方法があります：

#### 1. Authorizationヘッダー
- HTTPヘッダーに署名情報を追加
- 形式：`Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024`
- アクセスキー、署名付きヘッダーリスト、計算された署名が含まれる

#### 2. X-Amz-Signatureクエリパラメータ
- URLのクエリ文字列に署名情報を追加
- 事前署名付きURL生成に使用（S3の署名付きURLなど）
- 形式：`?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404`
- AWSの認証情報を要求することなく、プライベートリソースへの一時的なアクセスを提供できる
この追加により、問題で問われているAWS署名付きリクエスト（Signature 

## S3
### 署名付きURL
オブジェクトに対して、署名付きURLを発行することができます。その署名付きURLを知っているユーザーがプライベートなファイルにアクセスすることができます。

### バケットポリシーとIAMポリシー
| IAMポリシー | バケットポリシー | アクセス可否    |
|-------------|------------------|----------------|
| -           | -                | Access Denied  |
| Allow       | -                | Succeed        |
| -           | Allow            | Succeed        |
| Allow       | Allow            | Succeed        |
| Deny        | Allow            | Access Denied  |
| Allow       | Deny             | Access Denied  |

### Amazon Macie財務情報検出
`SensitiveData:S2Object/Financial`の検索タイプを使用して検索結果をフィルタリングすることができます。

### S3 ObjectLambda
S3に保存されているオブジェクトに対して、ユーザー定義の変換処理をオンザフライで実行できる機能です。通常、S3からオブジェクトを取得（GETリクエスト）すると、そのまま保存されているデータが返されますが、Object Lambdaを使うと、取得時にLambda関数を介してデータの変換や加工を行い、カスタムなレスポンスを返すことができます。

### KMSキーを使用したS3のサーバーサイド暗号化
x-amz-server-side-encryption: aws:kms
x-amz-server-side-encryption: AES256

## DynamoDB

### API

#### Batch Item
複数のテーブルから、複数のアイテムを一括で取得するためのAPIです。1回のリクエストで最大100個のアイテムを取得可能（サイズ制限もあります）。

#### GetItem
単一のテーブルから、特定の主キーを持つ1つのアイテムを取得するためのAPIです。指定したテーブルと主キーに対して、対応する1件のアイテムを返します。

#### Scan
テーブル全体、またはインデックス全体を走査してアイテムを取得するAPIです。テーブル内の全アイテムを読み込むため、フィルタ条件を指定しても読み込んだ後に結果を絞り込みます。

#### Query
主キー（パーティションキー）またはセカンダリインデックスを用いて、条件に合致するアイテムを効率的に取得するためのAPIです。Queryでは以下の主要な式（Expression）を使用できます：

* **KeyConditionExpression**: 必須（パーティションキー・ソートキーを指定する）
* **FilterExpression**: 任意（追加のフィルタリングに使用）
* **ProjectionExpression**: 任意（取得する属性を限定）
* **ExpressionAttributeNames / ExpressionAttributeValues**: 上記の式内で予約語や特殊文字を扱うために使用

##### KeyConditionExpression の例

KeyConditionExpressionはパーティションキーの完全一致指定が必須で、オプションでソートキーの条件を指定できます。

```python
# KeyConditionExpression の例
response = table.query(
    KeyConditionExpression="UserId = :uid",
    ExpressionAttributeValues={
        ":uid": "12345"
    }
)
```

パーティションキーの完全一致 + ソートキーの比較演算子を使用:

```python
# パーティションキーの完全一致 + ソートキーの比較演算子
response = table.query(
    KeyConditionExpression="UserId = :uid AND CreatedAt > :date",
    ExpressionAttributeValues={
        ":uid": "12345",
        ":date": "2025-01-01"
    }
)
```

パーティションキーの完全一致 + ソートキーの範囲指定（BETWEEN）:

```python
# パーティションキーの完全一致 + ソートキーの範囲指定（BETWEEN）
response = table.query(
    KeyConditionExpression="UserId = :uid AND CreatedAt BETWEEN :start AND :end",
    ExpressionAttributeValues={
        ":uid": "12345",
        ":start": "2025-01-01",
        ":end": "2025-12-31"
    }
)
```

パーティションキーの完全一致 + ソートキーのプレフィックス検索:

```python
# パーティションキーの完全一致 + ソートキーのプレフィックス検索
response = table.query(
    KeyConditionExpression="UserId = :uid AND begins_with(OrderId, :prefix)",
    ExpressionAttributeValues={
        ":uid": "12345",
        ":prefix": "ORDER-2025"
    }
)
```

##### FilterExpression の例

FilterExpressionはクエリ結果をさらに絞り込むための式です。これはキー以外の属性に対する条件指定に使います。

```python
# FilterExpression の例
response = table.query(
    KeyConditionExpression="UserId = :uid",
    FilterExpression="Price > :amount",
    ExpressionAttributeValues={
        ":uid": "12345",
        ":amount": 1000
    }
)
```

複数条件を持つFilterExpression:

```python
# 複数条件を持つFilterExpression
response = table.query(
    KeyConditionExpression="UserId = :uid",
    FilterExpression="Price > :min AND Price < :max",
    ExpressionAttributeValues={
        ":uid": "12345",
        ":min": 100,
        ":max": 500
    }
)
```

OR条件を持つFilterExpression:

```python
# OR条件を持つFilterExpression
response = table.query(
    KeyConditionExpression="UserId = :uid",
    FilterExpression="Category = :cat1 OR Category = :cat2",
    ExpressionAttributeValues={
        ":uid": "12345",
        ":cat1": "Books",
        ":cat2": "Electronics"
    }
)
```

属性の存在確認を行うFilterExpression:

```python
# 属性の存在確認を行うFilterExpression
response = table.query(
    KeyConditionExpression="UserId = :uid",
    FilterExpression="attribute_exists(DiscountCode)",
    ExpressionAttributeValues={
        ":uid": "12345"
    }
)
```

##### ProjectionExpression の例

ProjectionExpressionは取得する属性を限定するための式です。

```python
# ProjectionExpression の例
response = table.query(
    KeyConditionExpression="UserId = :uid",
    ProjectionExpression="OrderId, CreatedAt, Amount",
    ExpressionAttributeValues={
        ":uid": "12345"
    }
)
```

予約語を含む場合のProjectionExpression:

```python
# 予約語を含む場合のProjectionExpression
response = table.query(
    KeyConditionExpression="UserId = :uid",
    ProjectionExpression="OrderId, #date, #status",
    ExpressionAttributeNames={
        "#date": "Date",
        "#status": "Status"
    },
    ExpressionAttributeValues={
        ":uid": "12345"
    }
)
```

### GSIとLSI
GSI（グローバルセカンダリインデックス）はパーティションキーとソートキーを自由に再定義可能です。LSI（ローカルセカンダリインデックス）はベーステーブルの同一のパーティションキーを使用します。

#### 主な違い

| 項目 | GSI | LSI |
|------|-----|-----|
| 作成タイミング | テーブル作成後可能 | テーブル作成時のみ |
| 最大作成数 | 20 | 5 |
| 削除可能性 | 可 | 不可 |
| 容量管理 | 独立したプロビジョニング | ベーステーブルと共有 |
| レイテンシ | 高（グローバルクエリ） | 低（ローカルスコープ） |
| スループット | 独立したキャパシティ設定 | ベーステーブルに依存 |
| クエリ整合性 | 結果整合性のみ | 強い整合性可能 |
| パーティション分割 | 新規パーティション生成 | 既存パーティション活用 |

### キャパシティユニット

#### 読み込みキャパシティユニット (RCU)
* 基準: 4KB以下のデータ
* 種類別消費量:
   1. 結果整合性のある読み込み: 0.5 RCU
   2. 強力な整合性のある読み込み: 1 RCU
   3. トランザクション読み込み: 2 RCU

#### 書き込みキャパシティユニット (WCU)
* 基準: 1KB以下のデータ
* 種類別消費量:
   1. 通常の書き込み: 1 WCU
   2. トランザクション書き込み: 2 WCU

## Lambda
### Lambda実行ロール
#### AWSLambdaBasicExecutionRole
Lambda関数の基本的な実行環境を提供するための権限です。

#### AWSLambdaVPCAccessExecutionRole
Lambda関数がVPC内のリソース（例：RDS、ElastiCache、内部専用のAPIなど）にアクセスするための権限を提供します。

### /tmpディレクトリ
512MB〜10240MBまでのデータを一時的に保存することができるディレクトリです。

## CloudFormation
### SAM
AWS SAM（Serverless Application Model）は、サーバーレスアプリケーションの開発、テスト、デプロイを簡単にするためのオープンソースフレームワークです。AWS CloudFormationの拡張として、Lambda関数、API Gateway、DynamoDBテーブルなど、サーバーレスリソースを簡単にYAML形式で記述できます。SAMを使用する場合は、Transformセクションで以下のようにSAMバージョンを指定する必要があります：

```yaml
Transform: AWS::Serverless-2016-10-31
```

#### リソース
1. **AWS::Serverless::Function**
   - 概要：AWS Lambda関数を定義します。コードのパッケージ方法やランタイム、イベントソース（API Gateway、S3、SQSなど）との連携設定などをまとめて管理できます。

2. **AWS::Serverless::Api**
   - 概要：Amazon API Gateway (REST API)を構築するためのリソースです。SAMのテンプレート内でエンドポイントの定義とLambda関数などのバックエンドを関連付けできます。

3. **AWS::Serverless::HttpApi**
   - 概要：新しいタイプのAmazon API Gateway (HTTP API)を構築するためのリソースです。REST APIに比べてシンプルかつ低コスト、低レイテンシに最適化されています。

4. **AWS::Serverless::GraphQLApi**
   - 概要：AWS AppSyncを用いたGraphQL APIを定義するためのリソースです。AppSyncでGraphQLスキーマやデータソースを設定し、サーバーレス構成を構築できます。

5. **AWS::Serverless::Application**
   - 概要：別のSAMアプリケーション（ネストされたアプリケーションや、AWS Serverless Application Repositoryからのアプリ）を参照・デプロイするためのリソースです。

6. **AWS::Serverless::LayerVersion**
   - 概要：Lambda Layerを定義するリソースです。ライブラリや依存パッケージを切り出して共有し、複数のLambda関数で使い回せるようにします。

7. **AWS::Serverless::SimpleTable**
   - 概要：シンプルな設定でDynamoDBテーブルを作成するためのリソースです。主キー（パーティションキーのみ）をすぐに定義して使いたい場合などに便利です。

8. **AWS::Serverless::StateMachine**
   - 概要：AWS Step Functionsのステートマシンを定義するリソースです。Lambda関数や他のAWSサービスを組み合わせたワークフローをコード化できます。

9. **AWS::Serverless::Connect（またはConnector/その他）**
   - 概要：AWS SAMで新しく追加されつつあるリソースや、一部ドキュメントで言及される「コネクタ」系リソース（Connector）です。サービス間のアクセス権限の紐付けを簡略化する仕組みとして利用される場合があります。

## AWS X-Ray
分散アプリケーション（特にマイクロサービスアーキテクチャ）におけるトレーシングとデバッグを支援するサービスです。X-Rayは、アプリケーション全体のリクエストの流れを追跡し、各サービス間の通信経路を可視化します。これにより、リクエストの遅延やエラーが発生している箇所を迅速に特定できます。

主な機能：
- 各コンポーネントの処理時間やエラー率を測定し、システム全体のパフォーマンスやボトルネックを明らかにします
- 障害発生時に、どのサービスが原因かを特定するための詳細なトレース情報を提供し、デバッグ作業を効率化します

## CloudWatch
### メトリクスの保持期間
15ヶ月

### メモリに関するメトリクス
CloudWatch標準メトリクスにはメモリ取得を行うことはできないのでCloudWatchカスタムメトリクスを使用する必要がある。

## ECS
### ecs_enable_task_iam_role
ECSコンテナインスタンスはインスタンスプロファイル（EC2インスタンスに割り当てられたIAMロール）を介してAWSリソースへアクセスします。しかし、タスクごとに必要な権限が異なる場合、インスタンスのロールだけでは柔軟なアクセス制御が難しくなります。`ecs_enable_task_iam_role`を有効にすることで、各タスクが自分専用のIAMロール（タスクロール）を利用できるようになり、個別の権限設定が可能になります。

## ElasticBeanstalk
ElasticBeanstalk（EB）は、アプリケーションの展開、管理、スケーリングを迅速かつ簡単に行うためのAWSサービスです。以下はEBを効率的に利用するための主要な設定ファイルです。
### .ebextensions

#### 概要
Elastic Beanstalk 環境の詳細な設定・カスタマイズを行うための設定ファイル群です。アプリケーションのルートディレクトリに **.ebextensions** というディレクトリを作成し、その中に拡張子が **.config** の YAML ファイルを置きます。

#### 利用例
- 必要なソフトウェアパッケージのインストール
- OS レベルの設定変更
- カスタムコマンドの実行（例：起動時のシェルコマンド）
- ログローテーションや設定ファイルの上書き

#### 特徴
- Elastic Beanstalk がデプロイ時にこれらのファイルを読み込み、環境の構成を自動でセットアップしてくれます。
- 複雑な環境設定や、インフラ周りのカスタマイズをコードとして管理することが可能です。

#### 設定例

```yaml
# .ebextensions/01-install-packages.config
packages:
  yum:
    git: []
    mysql-devel: []

# .ebextensions/02-commands.config
commands:
  01_create_dir:
    command: "mkdir -p /var/log/myapp"
    ignoreErrors: true

# .ebextensions/03-options.config
option_settings:
  aws:elasticbeanstalk:application:environment:
    NODE_ENV: production
  aws:elasticbeanstalk:container:nodejs:
    NodeVersion: 16.x
```

### env.yaml

#### 概要
**env.yaml** は、プロジェクトやデプロイメントの際に、**環境変数やその他のオプション設定** を管理するために使われるファイルです。ただし、これは Elastic Beanstalk の標準機能というよりは、プロジェクトごとに取り入れられる運用方法のひとつです。

#### 利用例
- EB CLI（Elastic Beanstalk CLI）を利用する際に、環境変数を一括で設定するための情報をまとめる
- 複数の環境（開発、ステージング、本番など）で異なる設定値（例：DBのエンドポイント、APIキーなど）を管理する

#### 特徴
- このファイルに定義した環境変数を使って、eb setenv コマンドで Elastic Beanstalk 環境に一括反映させることができます。
- 環境ごとに設定値を管理しやすく、テンプレート化して再利用する際に便利です。

#### 設定例

```yaml
# env.yaml
development:
  APPLICATION_ENV: development
  DB_HOST: dev-db.example.com
  API_KEY: dev-api-key
  DEBUG: true

staging:
  APPLICATION_ENV: staging
  DB_HOST: staging-db.example.com
  API_KEY: staging-api-key
  DEBUG: false

production:
  APPLICATION_ENV: production
  DB_HOST: prod-db.example.com
  API_KEY: prod-api-key
  DEBUG: false
```

利用例:
```bash
# 開発環境に変数を設定
eb setenv --env development $(cat env.yaml | grep development -A4 | sed 's/development://g')

# 本番環境に変数を設定
eb setenv --env production $(cat env.yaml | grep production -A4 | sed 's/production://g')
```

## CodeDeploy,CodeBuild,CodePipeline
### BuildSpecファイル
CodeBuildで使用される設定ファイルである。YAML形式で記述される。サンプルコードは下記の通りである。
```
version: 0.2

env:
  variables:
    ENV_NAME: "production"

phases:
  install:
    commands:
      - echo "Installing dependencies..."
      - npm install

  pre_build:
    commands:
      - echo "Running pre-build commands..."
      - npm run lint

  build:
    commands:
      - echo "Building the application..."
      - npm run build

  post_build:
    commands:
      - echo "Post-build actions..."
      - aws s3 cp ./build s3://my-bucket/ --recursive

artifacts:
  files:
    - '**/*'
  base-directory: build

cache:
  paths:
    - 'node_modules/**/*'
```

### AppSpecファイル
AWS CodeDeployで使用される、アプリケーションのデプロイ手順を定義したものである。YAML形式で記述される。サンプルコードは下記の通りである。

```
version: 0.0

os: linux

files:
  - source: /build/build.zip
    destination: /var/www/myapp
    overwrite: yes

hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: ec2-user

  AfterInstall:
    - location: scripts/restart_server.sh
      timeout: 60
      runas: ec2-user

  ApplicationStart:
    - location: scripts/start_application.sh
      timeout: 60
      runas: ec2-user

  ValidateService:
    - location: scripts/validate_service.sh
      timeout: 60
      runas: ec2-user
```

## AWS X-Ray
### トレースの取得
GetTraceSummaries APIを使用してアプリケーションのトレースIDのリストを取得できる。また、BatchGetTraces APIを使用することでトレースデータを取得できる。

## エラー
### HTTP502エラー
Bad Gateway と呼ばれているエラーです。サーバーがゲートウェイまたはプロキシとして動作し、上流のサーバーから無効なレスポンスを受け取った場合に発生します。クライアントからのリクエストは正常に受け取られますが、バックエンドサービスとの通信に問題が生じた場合に返されます。
### HTTP504エラー
GatewayTimeoutと呼ばれているエラーです。上流のサーバーからタイムリーな応答が得られなかった場合に発生します。