vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

AWS HTTP Header の追加・変更方法

AWS上のWebサーバ構成でHTTP Headerの追加・変更についてのメモ。
Target(Origin) に追加・変更したヘッダを渡したい場合に焦点を当てています。

f:id:htnosm:20210925052744p:plain

WAFv2

CloudFront

Lambda@Edge

rewrite-host-header-index.js

CloudFront Functions

ELB(ALB)


AWS Step Functions から CodeBuild 呼び出しでパラメータを渡す

Step Functions から CodeBuild が呼び出せますが、その際にパラメータを渡す方法にちょっと嵌ったのでメモ。

結論から、ドキュメント読みましょうでした。

Note
Parameters in Step Functions are expressed in PascalCase, even when the native service API is camelCase.

上記のページからパラメータごとに各API Referenceページにリンクされていますが、 API Reference 記載のままでは利用できません。

保存する際に以下のようなエラーになります。

The field "xxxxx" is not supported by Step Functions

環境変数を上書きする場合、environmentVariablesOverride を使用します。 記載されている構文が以下だった場合でも、

  • Request Syntax(抜粋)
   "environmentVariablesOverride": [ 
      { 
         "name": "string",
         "type": "string",
         "value": "string"
      }
   ],

Step Function の定義時の各キーは先頭大文字(EnvironmentVariablesOverride)にする必要があります。

  • State machine Definition
    "CodeBuild StartBuild": {
      "Type": "Task",
      "Resource": "arn:aws:states:::codebuild:startBuild.sync",
      "Parameters": {
        "ProjectName": "xxxxx",
        "EnvironmentVariablesOverride": [
          {
            "Name": "Env",
            "Type": "PLAINTEXT",
            "Value": "dev"
          }
        ]
      },
      "End": true
    }

AWS RDS の IAM 認証と RDS Proxy

いずれも提供されてからしばらく経ちますが、組み合わせてみるとややこしいことになったので整理してみます。

RDS Proxy の利用用途は Lambda を想定しているようで、Lambdaに機能として持っていますし、情報も多いです。(本稿でLambda部分は触れてません)

目次

認証パターン

  • (a) RDSへのパスワード認証(ネイティブ認証)
  • (b) RDSへのIAM認証
  • (c) RDS Proxy 経由でのパスワード認証(ネイティブ認証)
  • (d) RDS Proxy へのIAM認証

f:id:htnosm:20210823080957p:plain

設定パターン

RDSは パスワード認証のみパスワード認証とIAM認証の併用 が選択できます。
RDS Proxy は、 パスワード認証のみIAM認証のみ のいずれかです。また、 IAM認証利用には Transport Layer Security 必須 となります。

設定パターン [RDS Proxy]
Require Transport Layer Security
[RDS Proxy]
IAM authentication
[RDS]
IAM DB authentication
(a)password->RDS (b)IAM->RDS (c)password->Proxy->RDS (d)IAM->Proxy->RDS
Proxy未使用。RDSパスワード認証。 Not enabled o x
Proxy未使用。RDSパスワード・IAM 併用。 Enabled o o
Proxyパスワード認証。RDSパスワード認証。 Not enabled Not enabled Not enabled o x o x
Proxyパスワード認証。RDSパスワード・IAM 併用。 Not enabled Not enabled Enabled o o o x
Proxyパスワード認証、TLS必須。RDSパスワード認証。 Enabled Not enabled Not enabled o x o x
Proxyパスワード認証、TLS必須。RDSパスワード・IAM 併用。 Enabled Not enabled Enabled o o o x
(※1)Proxy利用不可。 RDSパスワード認証。 Not enabled Required Not enabled o  x  ー  ー 
(※1)Proxy利用不可。 RDSパスワード・IAM 併用。 Not enabled Required Enabled o  o  ー  ー 
Proxy IAM認証、TLS必須。RDSパスワード認証。 Enabled Required Not enabled o x x o
(※2)Proxy IAM認証、TLS必須。 RDSパスワード・IAM 併用。 Enabled Required Enabled o o x o

(※)設定について

(※1)

設定時にエラーにはならず設定自体はできてしまうのですが、繋がりません。

  • ProxyへIAM認証での接続にはTLSを利用する
    • Make sure that you use Transport Layer Security (TLS) / Secure Sockets Layer (SSL) when connecting to a proxy using IAM authentication.

(※2)

  • ProxyへIAM認証を使用する場合、RDS側でIAMを有効にしない
    • When you use IAM for the connection to a proxy, make sure that the underlying RDS DB instance or Aurora DB cluster doesn't have IAM enabled.

データベースユーザ単位で、RDSへのIAM認証かRDS ProxyへのIAM認証かを指定する形が取れます。

  • RDS Proxy からの接続にIAM認証を利用するデータベースユーザーは、RDS側で IAM 認証が設定されていない状態とする必要ある。
  • DB インスタンスの設定自体としては、IAM 認証を有効化していても問題ない。

ユーザ単位での併用パターン

1データベース単位で見ると併用可能なパターンは以下のようになるかと思います。
IAM認証の併用(RDS直とRDS Proxy両方にIAM認証)は不可です。
また、IAM認証の場合はCNAMEでの接続はサポートされていません。

RDS RDS Proxy データベースユーザ Secrets Manager
パスワード 使用しない パスワード設定 不要
パスワード パスワード パスワード設定 Proxy経由に必要
IAM 利用不可 認証プラグイン設定 不要
パスワード IAM パスワード設定 Proxy経由に必要

認証プラグイン設定

RDS へIAM認証で接続する場合に必要です。
MySQLの場合、DBユーザ作成時にプラグインを指定します。パスワード不要です。

CREATE USER jane_doe IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; 

接続するIAM UserまたはIAM Role に接続許可ポリシーを追加します。
(Administrator など、既に権限が設定されている場合は不要です。)
リソースを指定する場合のIDは Resource (ID リソース ID) です。 (DB Instance Identifier や Cluster Identifier ではありません)

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:us-east-2:1234567890:dbuser:cluster-ABCDEFGHIJKL01234/db_user"
         ]
      }
   ]
}

IAM認証でのRDS接続

署名付き認証トークンを取得し、パスワードに指定します。
後述CA証明書を事前にダウンロードしておく必要があります。

Secrets Manager 設定

RDS Proxy 経由で接続する場合に必要です。
データベースユーザは通常通り、パスワードを設定します。

マネジメントコンソールから作成するとテンプレートは以下の内容になります。
最低でも usernamepassword の設定が必要です。

{
  "dbInstanceIdentifier": "xxxxx",
  "engine": "aurora-mysql",
  "host": "xxxxx.cluster-zzzzz.us-east-2.rds.amazonaws.com",
  "port": 3306,
  "resourceId": "cluster-XXXXXXXXXXXXXXXXXXXXXXXXXX",
  "username": "example-user",
  "password": "example-password"
}

RDS Proxy の IAM Role へ Secret へのアクセス許可ポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetSecretValue",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_1",
            ]
        },
...
    ]
}

ProxyでのIAM認証許可設定

RDS Proxy 経由で IAM認証 を使用する場合に必要です。

接続するIAM UserまたはIAM Role に接続許可ポリシーを追加します。
(Administrator など、既に権限が設定されている場合は不要です。)
リソースを指定する場合のIDはRDS Proxyの Resource (ID リソース ID) です。 (Proxy Identifier ではありません)
Proxy ARN の末尾( prx-xxxxx )になります。

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "Resource": "arn:aws:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"
         ]
      }
   ]
}

制限など

利用を想定している環境がサポートされているか確認しましょう。 さらっと重要な事が書いてある気がします。

RDS Proxy

CNAMEでの接続はできません。

You can't use RDS Proxy with custom DNS.

Proxyへはデフォルトポートでの接続です。

Currently, all proxies listen on port 3306 for MySQL. Currently, all proxies listen on port 5432 for PostgreSQL.

IAM認証

現在とあるので今後利用できるようになりそうですが、CNAMEでの接続はできません。

Currently, IAM database authentication isn't supported for CNAMEs.

Aurora MySQL の場合、 t2/t3.small での利用ができません。

For Aurora MySQL, all supported DB instance classes support IAM database authentication, except for db.t2.small and db.t3.small.

CA証明書

IAM認証で利用するCA証明書は、RDSとRDS Proxyで異なります。

IAM 認証のオーバヘッド

下記はMySQLの制限事項とのことですが、 IAM認証のオーバヘッドが発生という点は、PostgresでもProxyでもありそうです。

If you exceed the limit of maximum new connections per second, then the extra overhead of IAM database authentication can cause connection throttling.


当初思っていたより複雑でした。 Auroraだとデータベースユーザ作成まで行なってくれるのかなと期待していたのですが、データベースユーザの管理は残ります。
これまで通りデータベース内でのアクセス制御無しでユーザを作り(MySQLの場合ホスト%)、 経路はSecurityGroupで制限、 認証は用途に合わせて選択という感じでしょうか。

AWS CDK を AWS SSO で利用

cdk deploy, cdk diff 実行時に以下のエラーに遭遇しました。 実行対象のAWSアカウントへは AWS SSO を利用してアクセスしている環境でした。

Unable to resolve AWS account to use. It must be either configured when you define your CDK or through the environment

debug log 出力(--verbose) してみると下記エラー。

Unable to determine the default AWS account: ProcessCredentialsProviderFailure: Profile xxxxx did not include credential process

誤設定を疑って調べていたのですが、aws cli 実行は問題なく行え、cdk doctor でも正しい値を返していました。

原因

現時点で cdk では Named Profile をサポートしていないようです。

~/.aws/credentials への設定がある形式でないと認識できないようです。

対処

上記Issueの中でいくつか回避策が提示されています。

aws-export-credentialsaws-sso-credential-process を利用する方式を使わせてもらおうと思ったのですが、 aws-sso-util に組み込まれているとのことなので、こちらを利用します。

インストール

記載の手順通りにインストールします。

brew install pipx
pipx ensurepath
pipx install aws-sso-util
  • 確認
~ % pipx list
venvs are in /Users/xxxxx/.local/pipx/venvs
apps are exposed on your $PATH at /Users/xxxxx/.local/bin
   package aws-sso-util 4.25.0, Python 3.9.5
    - aws-sso-util
~ % aws-sso-util --version
4.25.0

関数設定

~/.zshrc などで読み込ませます。 AWS_CONFIGURE_SSO_DEFAULT_* の値は適宜変更します。

export AWS_CONFIGURE_SSO_DEFAULT_SSO_START_URL=https://xxxxx.awsapps.com/start
export AWS_CONFIGURE_SSO_DEFAULT_SSO_REGION=us-east-1

実行

  • ~/.aws/config
    • AWS SSO 向け設定がしてある状態
    • credential_process を追加
[profile xxxxx]
sso_start_url= https://xxxxx.awsapps.com/start
sso_region=ap-northeast-1
sso_account_id=123456789012
sso_role_name=XXXXX
credential_process = aws-sso-util credential-process --profile xxxxx
  • sso login
aws-sso-util login

# もしくは
#aws sso login --profile XXXXX

以上で正常に cdk コマンド正常が行えました。

いずれ cdk 側で正式にサポートされると思いますが、当面はこちらの方法を利用したいと思います。

aws-export-credentials

If you try this and your tools still don't work with the credentials, you can get the credentials themselves using aws-export-credentials, which can also inject them as environment variables for your program.

今回は aws-sso-util のみで必要十分だったのですが、せっかくなので載せておきます。

# インストール
pipx install aws-export-credentials
aws-export-credentials --version

# 環境変数設定
eval $(aws-export-credentials --env-export)
#eval $(aws-export-credentials --profile XXXXX --env-export) 

# 確認
env | grep AWS

Datadog へ Fluent Bit 内部メトリクスの送信

前置き

Fluent Bit で HTTP_Server を有効化することでメトリクスを参照できる機能があります。 (v1.7.0 時点では、Windows は非対応のようです)

これを Datadog に流します。

インテグレーションが用意されているのではと思ったのですが、 ログの送信先としての案内はありますが、メトリクスはありません。 (尚、Fluentd はあります)

公式ドキュメントの方に記述は見つけられなかったのですが、OpenMetrics で連携ができるとのことでした。 Datadog は Prometheus, OpenMetrics をサポートしており、いずれもインテグレーションが用意されています。

設定

openmetrics.d/conf.yaml に Fluent Bit の Prometheus format のエンドポイント (api/v1/metrics/prometheus)を指定することで、 カスタムメトリクスとして転送されます。

サンプル記載例

instances:
  - prometheus_url: <PROMETHEUS_URL>
    namespace: service
    metrics:
      - processor:cpu
      - memory:mem
      - io

全メトリクスを対象にする例

instances:
  - prometheus_url: http://127.0.0.1:2020/api/v1/metrics/prometheus
    namespace: td-agent-bit
    metrics: 
      - '*'

Datadog 上での表示

Fluent Bit のプラグイン名がname タグに振り分けられます。

f:id:htnosm:20210530111626p:plain

AWS ロールの切り替え(スイッチロール)のブックマーク

AWSのマネジメントコンソールでロール切り替えをする際に、 履歴の数では賄えなくなってきたためロール管理方法のメモ

管理ツールなど


あまのじゃく

  • 拡張機能使わず、ブックマークで良い
  • まとめて生成したい
  • 設定は1箇所で賄いたい

~./aws/config (color = xxxxx でカラー指定) からインポート用のファイルを生成

Generate bookmarks HTML based on ~/.aws/config

$ curl -O https://gist.githubusercontent.com/htnosm/86483972e3a32b93fd6666db8a58b60d/raw/034885c71731c8b78e2416f1ce7a6f2452a4dc92/generate-aws-switch-role-bookmark.py

$ python -V
Python 3.8.9
$ python generate-aws-switch-role-bookmark.py > bookmark.html

AWS ChatbotのEventBridgeサポート

AmazonEventBridge を介して Chatbot を利用できるようになりました。

ドキュメントにも以下の記載があります。

Currently, AWS Chatbot can process all service events handled by Amazon EventBridge.

  • 以前は未サポート形式だとエラー
Event received is not supported (see https://docs.aws.amazon.com/chatbot/latest/adminguide/related-services.html )
  • AutoScaling イベントの通知例

f:id:htnosm:20210421102140p:plain

残念ながらカスタムイベントはサポートされていませんが、 ほぼほぼ網羅された感じです。