1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS AmplifyでBasic認証を実装する際のセキュリティ考慮点とCDK実装パターン

Last updated at Posted at 2025-09-19

概要

  • AWS AmplifyのアプリケーションにBasic認証をつけたい

検討した選択肢

  • Option A: AWS Amplify Access Control(環境変数)
  • Option B: AWS Amplify Access Control(CfnParameter)
  • Option C: Next.js Middleware による認証
  • Option D: CloudFront Functions による認証
  • Option E: Amazon Cognito による認証

選択肢を図にすると以下のようになります。

CloudFront Functionsが使えればBasic認証に加えて、その他の細かい設定も可能なのですが、AmplifyのCloudFrontにはCloudFront Functionsは使えないようです。

AmplifyのAccess Controlを使う

Next.jsのMiddleware、Cognitoを使った認証も可能ですが、できるだけユーザーに近い側で認証をかけたいので用意されているAmplifyのAccess Controlを使います。

Access Controlは追加料金の記載がないので無料と考えられます。(Basic認証で弾いたリクエスト数に応じた従量課金が発生するかは不明)

CDKで実装する

以下の2つのオプションを考えます。

  • Option A: AWS Amplify Access Control(環境変数)
  • Option B: AWS Amplify Access Control(CfnParameter)

パスワードという機密情報を扱うため、パラメータストアやSecrets Managerから呼び出すのが筋ですが、L1コンストラクタのため平文でしか指定できません。
環境変数を使用してもBasic認証の情報を設定するとテンプレートに平文で保存されてしいます。

ちなみにaws-amplify-alphaではSecrets Managerにパスワードを生成して使用できるようです。
alphaはバージョンアップの際にコードが変わるので、今回は使用しませんでした。
https://docs.aws.amazon.com/cdk/api/v2/docs/@aws-cdk_aws-amplify-alpha.BasicAuthProps.html

環境変数を使う

以下のようなコードであれば環境変数経由でユーザー名とパスワードを指定できるので、これらの認証情報は(適切に管理していれば)問題ないはずです。

  const username = process.env.BASIC_AUTH_USERNAME;
  const password = process.env.BASIC_AUTH_PASSWORD;

  basicAuthConfig = {
    enableBasicAuth: true, username, password
  }

しかし上のコードで生成されるテンプレートには平文で埋め込まれてしまいます。

Resources:
  MyApp:
    Type: AWS::Amplify::App
    Properties:
      BasicAuthConfig:
        Username: "user"      # ← 平文でテンプレートに保存
        Password: "password"  # ← 平文でテンプレートに保存

CfnParameterを使う

CfnParameterのnoEchoプロパティをtrueにすると、パラメータ値をマスクすることができます。

  const usernameParam = new cdk.CfnParameter(this, 'BasicAuthUsername', {
    type: 'String',
    description: 'BASIC_AUTH_USERNAME',
    noEcho: true
  })
  const passwordParam = new cdk.CfnParameter(this, 'BasicAuthPassword', {
    type: 'String',
    description: 'BASIC_AUTH_PASSWORD',
    noEcho: true
  })
  basicAuthConfig = {
    enableBasicAuth: true,
    username: usernameParam.valueAsString,
    password: passwordParam.valueAsString
  }
}

テンプレートで以下のように表現されます。

Resources:
  MyApp:
    Type: AWS::Amplify::App
    Properties:
      BasicAuthConfig:
        Password: !Ref BasicAuthPassword
        Username: !Ref BasicAuthUsername
Parameters:
  BasicAuthUsername:
    Type: String
    Description: BASIC_AUTH_USERNAME
    NoEcho: true
  BasicAuthPassword:
    Type: String
    Description: BASIC_AUTH_PASSWORD
    NoEcho: true

CDKコマンド実行時は、以下のようにparametersオプションを設定する必要があります。

cdk deploy --parameters BasicAuthUsername=$BASIC_AUTH_USERNAME \
           --parameters BasicAuthPassword=$BASIC_AUTH_PASSWORD

設定忘れ防止のため、これらの値が未指定だったらbasicAuthConfigの指定をしないよう、if文を仕込んでおいたほうがよさそうです。

// cdk.jsonにBasic認証を使用するかのフラグを設定する
const useFrontBasicAuth = this.node.tryGetContext('useFrontBasicAuth') || false

// 環境変数から値を読み込む
const username = process.env.BASIC_AUTH_USERNAME
const password = process.env.BASIC_AUTH_PASSWORD
let basicAuthConfig

if (useFrontBasicAuth && username && password) {
  const usernameParam = new cdk.CfnParameter(this, 'BasicAuthUsername', {
    type: 'String',
    description: 'BASIC_AUTH_USERNAME',
    noEcho: true
  })
  const passwordParam = new cdk.CfnParameter(this, 'BasicAuthPassword', {
    type: 'String',
    description: 'BASIC_AUTH_PASSWORD',
    noEcho: true
  })
  basicAuthConfig = {
    enableBasicAuth: true,
    username: usernameParam.valueAsString,
    password: passwordParam.valueAsString
  }
}

参考リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?