いわさです。
先日、AWS Verified Access を AWS CLI で作成・削除する方法を紹介しました。
またしばらく CloudFormation がサポートされるまでは時間がかかるかなと思って、自動化を導入するために CLI で実行していました。
しかし、先日 CloudFormaiton が Verified Access をサポートしました。
これで作ったり消したりが楽になりますね。
本日はテンプレートを作成して動作確認まで行ったので紹介します。
サポートされているリソース
前述の AWS CLI での構築記事のとおり、Verified Access で構築が必要なコンポーネントは主に以下の 4 つです。
- Verified Access インスタンス
- Verified Access 信頼プロバイダー
- Verified Access グループ
- Verified Access エンドポイント
本日時点で上記全てがサポートされていますので、CloudFormation で一撃で作成と削除が出来るようになりました。
リソースは次のものを使用します。
- AWS::EC2::VerifiedAccessEndpoint
- AWS::EC2::VerifiedAccessGroup
- AWS::EC2::VerifiedAccessInstance
- AWS::EC2::VerifiedAccessTrustProvider
テンプレート一式
今回は信頼プロバイダーに 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 はプロビジョニングされている間料金が発生しますが、停止が出来ません。
そのあたりを考慮した自動化のアイディアも出てくるかもしれないですね。