[アップデート] AWS Verified Access が CloudFormation でサポートされました

2023.05.12

いわさです。

先日、AWS Verified Access を AWS CLI で作成・削除する方法を紹介しました。
またしばらく CloudFormation がサポートされるまでは時間がかかるかなと思って、自動化を導入するために CLI で実行していました。

しかし、先日 CloudFormaiton が Verified Access をサポートしました。
これで作ったり消したりが楽になりますね。

本日はテンプレートを作成して動作確認まで行ったので紹介します。

サポートされているリソース

前述の AWS CLI での構築記事のとおり、Verified Access で構築が必要なコンポーネントは主に以下の 4 つです。

  • Verified Access インスタンス
  • Verified Access 信頼プロバイダー
  • Verified Access グループ
  • Verified Access エンドポイント

本日時点で上記全てがサポートされていますので、CloudFormation で一撃で作成と削除が出来るようになりました。
リソースは次のものを使用します。

テンプレート一式

今回は信頼プロバイダーに Azure AD をまた使っています。
ここが Identity Center になるのか、デバイスになるのかによってAWS::EC2::VerifiedAccessTrustProviderの設定内容が変わる感じです。

次のテンプレートではプライベートアプリケーションや、Azure AD は構成済みで Verified Access に必須な最低限のコンポーネントのみ定義しています。
実際は私は以下に加えて、プライベートアプリケーションリソースや Route 53 ホストゾーン、 ACM などもデプロイ出来るようにしています。

template.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Parameters: 
  AlbArn:
    Type: String
    Default: arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/hoge0512private-internal-alb/c7942d63a2576119
  VerifiedAccessEniSubnetList:
    Type: CommaDelimitedList
    Default: subnet-0c858d5f0255c1bd0,subnet-0a88fd123fcbd8277
  VerifiedAccessEniSecurityGroupList:
    Type: CommaDelimitedList
    Default: sg-00d170d535bd26ad4

Resources: 
  HogeInstance:
    Type: AWS::EC2::VerifiedAccessInstance
    Properties: 
      VerifiedAccessTrustProviderIds: 
        - !Ref HogeTrustProvider

  HogeTrustProvider:
    Type: AWS::EC2::VerifiedAccessTrustProvider
    Properties: 
      OidcOptions: 
        AuthorizationEndpoint: https://login.microsoftonline.com/11111111-2222-3333-4444-555555555555/oauth2/v2.0/authorize
        ClientId: 4197fa0d-0bcd-4398-bafd-6a68e661bf9c
        ClientSecret: aaaaabbbbbcccccdddddeeeeefffffggggg
        Issuer: https://login.microsoftonline.com/11111111-2222-3333-4444-555555555555/v2.0
        Scope: openid
        TokenEndpoint: https://login.microsoftonline.com/11111111-2222-3333-4444-555555555555/oauth2/v2.0/token
        UserInfoEndpoint: https://graph.microsoft.com/oidc/userinfo
      PolicyReferenceName: hoge0512policy
      TrustProviderType: user
      UserTrustProviderType: oidc

  HogeGroup:
    Type: AWS::EC2::VerifiedAccessGroup
    Properties: 
      PolicyDocument: "permit(principal,action,resource) when { true };"
      PolicyEnabled: true
      VerifiedAccessInstanceId: !Ref HogeInstance

  HogeEndpoint:
    Type: AWS::EC2::VerifiedAccessEndpoint
    Properties: 
      ApplicationDomain: hoge0512.tak1wa.com
      AttachmentType: vpc
      DomainCertificateArn: arn:aws:acm:us-east-1:123456789012:certificate/47b9e1c1-6c21-431f-ba7c-84c89500f0d6
      EndpointDomainPrefix: hoge0512
      EndpointType: load-balancer
      LoadBalancerOptions: 
        LoadBalancerArn: !Ref AlbArn
        Port: 80
        Protocol: http
        SubnetIds: !Ref VerifiedAccessEniSubnetList
      SecurityGroupIds: !Ref VerifiedAccessEniSecurityGroupList
      VerifiedAccessGroupId: !Ref HogeGroup

Outputs:
  EndpointDomain:
    Value: !GetAtt HogeEndpoint.EndpointDomain

使ってみる

上記テンプレートをデプロイする前に次の記事を参考にサンプルのプライベートアプリケーションや Azure AD を構成しておきます。

私は CloudFormation のデプロイに普段は rain を使っていますがデプロイ方法はマネジメントコンソールでも何でも良いです。
rain に興味のある方は以下も参考にしてください。

% rain deploy template.yaml hoge0512private -r us-east-1             
Enter a value for parameter 'BaseAMI' (default value: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2): 
CloudFormation will make the following changes:
Stack hoge0512private:
  + AWS::EC2::VPCGatewayAttachment AttachGateway
  + AWS::EC2::EIP EipNatGateway1
  + AWS::EC2::SecurityGroup HogeSecurityGroup
  + AWS::EC2::SecurityGroup InternalAlbServerSecurityGroup
  + AWS::ElasticLoadBalancingV2::Listener InternalListenerHTTP
  + AWS::ElasticLoadBalancingV2::LoadBalancer InternalLoadBalancer
  + AWS::ElasticLoadBalancingV2::TargetGroup InternalTargetGroup
  + AWS::EC2::InternetGateway InternetGateway
  + AWS::EC2::NatGateway NatGateway1
  + AWS::EC2::Route ProtectedRoute1
  + AWS::EC2::RouteTable ProtectedRouteTable1
  + AWS::EC2::SubnetRouteTableAssociation ProtectedSubnet1RouteTableAssociation
  + AWS::EC2::Subnet ProtectedSubnet1
  + AWS::EC2::Subnet ProtectedSubnet2
  + AWS::EC2::RouteTable PublicRouteTable
  + AWS::EC2::Route PublicRoute
  + AWS::EC2::SubnetRouteTableAssociation PublicSubnet1RouteTableAssociation
  + AWS::EC2::Subnet PublicSubnet1
  + AWS::EC2::VPC VPC
  + AWS::IAM::InstanceProfile WebProfil
  + AWS::IAM::Role WebRole
  + AWS::EC2::SecurityGroup WebServerSecurityGroup
  + AWS::EC2::Instance WebServer
Do you wish to continue? (Y/n) 
Deploying template 'template.yaml' as stack 'hoge0512private' in us-east-1.
Stack hoge0512private: CREATE_COMPLETE
  Outputs:
    LoadBalancerArn: arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/hoge0512private-internal-alb/c7942d63a2576119
    HogeSecurityGroup: sg-00d170d535bd26ad4
    SubnetId2: subnet-0a88fd123fcbd8277
    SubnetId1: subnet-0c858d5f0255c1bd0
Successfully deployed hoge0512private

プライベートアプリケーションのスタック出力(上記ハイライト部分)を Verified Access 用のテンプレートで使っています。

% rain deploy template.yaml hoge0512verified -r us-east-1
Enter a value for parameter 'AlbArn' (default value: arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/hoge0512private-internal-alb/c7942d63a2576119): 
Enter a value for parameter 'VerifiedAccessEniSubnetList' (default value: subnet-0c858d5f0255c1bd0,subnet-0a88fd123fcbd8277): 
Enter a value for parameter 'VerifiedAccessEniSecurityGroupList' (default value: sg-00d170d535bd26ad4): 
CloudFormation will make the following changes:
Stack hoge0512verified:
  + AWS::EC2::VerifiedAccessEndpoint HogeEndpoint
  + AWS::EC2::VerifiedAccessGroup HogeGroup
  + AWS::EC2::VerifiedAccessInstance HogeInstance
  + AWS::EC2::VerifiedAccessTrustProvider HogeTrustProvider
Do you wish to continue? (Y/n) Y
Deploying template 'template.yaml' as stack 'hoge0512verified' in us-east-1.
Stack hoge0512verified: CREATE_COMPLETE
  Outputs:
    EndpointDomain: hoge0512.edge-0310b1980996fdee7.vai-0ee09269ca0974ec3.prod.verified-access.us-east-1.amazonaws.com
Successfully deployed hoge0512verified

Azure AD の構成情報についてはテンプレート内にハードコードしてるのでご注意ください。
ClientSecret とか含まれているのでこのまま使うのは良くない感じです。
とはいえ現時点では SecretsManager などは使えずリソースに直接渡す必要はあるので、最低でもパラメータ化して NoEcho させるところまででしょうか。

なお、上記の Verified Access 一式スタックのデプロイが完了するまで約 10 分かかりました。参考までに。

Verified Access 一式がデプロイされるとエンドポイントドメインが取得出来るようになるので、カスタムドメインで名前解決出来るようにします。

そして Azure AD のリダイレクト URI にカスタムドメインを次のように指定しましょう。

アクセスしてみると IdP の認証が要求され、認証成功するとプライベートアプリケーションにアクセス出来るようになっているはずです。

削除

もちろん CloudFormation スタックを削除すれば、Verified Access 一式が削除されます。

こちらもスタック削除完了までは数分かかりました。
しかし、1 Click で全部削除出来るのはかなり良いです。

さいごに

本日は Verified Access が CloudFormation でサポートされたので使ってみました。

これは私はかなり嬉しいですね。
普段検証で繰り返し作成と削除を繰り返すのですが、その数分〜数十分を自動化出来るのはとても大きい。

Verified Access はプロビジョニングされている間料金が発生しますが、停止が出来ません。
そのあたりを考慮した自動化のアイディアも出てくるかもしれないですね。