春ですね。
新生活の始まりの時期です。
例に漏れず、私生活がバタバタしてブログが書けてないという良くない状況でした。
波田野さんが「最近ブログとかもなくて寂しい」的なことをおっしゃっており、コミュニティに微妙ながらも貢献できたらと思いその後のやり取りについて検証してみたいと思います。
その後のやりとり
private に立てた場合は、マネコンからでも ssm 接続はさすがきできないかな。
— おむろん (@omuron) 2021年4月8日
結局 bastion たてて ssm で入って private に ssh するしかないですよね #jawsug_cli
ssmエージェントがssm apiと通信できないから無理ですねー #jawsug_cli
— HATANO Hirokazu (@tcsh) 2021年4月8日
VPCの仕組み上やっぱり無理ですね。
— おむろん (@omuron) 2021年4月8日
マネコンからなら不思議なパワーでワンチャンあればと思ったけどやっぱり無理ですかー。
マネコンがAPIのラッパーで有る限りはできないと思います(笑
— HATANO Hirokazu (@tcsh) 2021年4月8日
バイパスする様になるとセキュリティ規格とか通りづらくなるのではないかと想像します...
うん、言われてみればマネコンは API のラッパーなのでできないですね。
ということで試してみました。
環境構築
bastion 用の EC2 をパブリックとプライベートの VPC に構築します。
前提条件
CloudFormation テンプレート
AWSTemplateFormatVersion: 2010-09-09 Description: Bastion Parameters: InstanceType: Description: Instance type Type: String Default: t3.micro AllowedValues: - t3.nano - t3.micro - t3.small VpcId: Description: VPC ID Type: String VpcPublicId: Description: VPC public subnet ID Type: String VpcPrivateId: Description: VPC private subnet ID Type: String Resources: # セキュリティグループ BastionSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: bastion VpcId: !Sub ${VpcId} Tags: - Key: Name Value: bastion # アウトバウンド # yum 向けに 80 を許可 BastionSGEgressAllowHttp: Type: AWS::EC2::SecurityGroupEgress Properties: GroupId: !GetAtt BastionSecurityGroup.GroupId CidrIp: 0.0.0.0/0 IpProtocol: tcp FromPort: 80 ToPort: 80 Description: yum (http) # Session Manager 向けに 443 を許可 BastionSGEgressAllowHttps: Type: AWS::EC2::SecurityGroupEgress Properties: GroupId: !GetAtt BastionSecurityGroup.GroupId CidrIp: 0.0.0.0/0 IpProtocol: tcp FromPort: 443 ToPort: 443 Description: Session Manager (https) # IAM ロール BastionInstanceRole: Type: AWS::IAM::Role Properties: RoleName: bastion AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore # インスタンスプロファイル BastionInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: / Roles: [ !Ref BastionInstanceRole ] InstanceProfileName: bastion # EC2 インスタンス BastionInstance: Type: AWS::EC2::Instance Properties: ImageId: ami-06098fd00463352b6 BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: VolumeSize: 8 VolumeType: gp2 DeleteOnTermination: true EbsOptimized: true IamInstanceProfile: !Ref BastionInstanceProfile InstanceType: !Ref InstanceType CreditSpecification: CPUCredits: unlimited SubnetId: !Sub ${VpcPublicId} SecurityGroupIds: [ !Ref BastionSecurityGroup ] SourceDestCheck: true DisableApiTermination: false UserData: !Base64 | #!/bin/bash sudo yum -y update sudo yum -y install gcc Tags: - Key: Name Value: bastion-public # EC2 インスタンス PrivateInstance: Type: AWS::EC2::Instance Properties: ImageId: ami-06098fd00463352b6 BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: VolumeSize: 8 VolumeType: gp2 DeleteOnTermination: true EbsOptimized: true IamInstanceProfile: !Ref BastionInstanceProfile InstanceType: !Ref InstanceType CreditSpecification: CPUCredits: unlimited SubnetId: !Sub ${VpcPrivateId} SecurityGroupIds: [ !Ref BastionSecurityGroup ] SourceDestCheck: true DisableApiTermination: false UserData: !Base64 | #!/bin/bash sudo yum -y update sudo yum -y install gcc Tags: - Key: Name Value: bastion-private
パラメーター
InstanceType
: インスタンスタイプを選択VpcId
: VPC の ID を指定VpcPublicId
: パブリックの VPC サブネット ID を指定VpcPrivateId
: プライベートの VPC サブネット ID を指定
セキュリティグループ
yum
とセッションマネージャを利用するためにアウトバウンドに 80/443 の穴を開けます。
インバウンドは開けません。
IAM ロール
AmazonSSMManagedInstanceCore
のマネージドポリシーを付与します。
EC2
最新の AL2 AMI は以下のコマンドで取得しました。
aws ssm get-parameter \ --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \ --region ap-northeast-1
セッションマネージャで接続するので、キーペアは利用しません。
結果
EC2
EC2 インスタンスがパブリックとプライベートに構築されてます。
セッションマネージャ
セッションマネージャには、パブリックの EC2 しか見えてません。
「セッションの開始」から接続できます。
セッションマネージャを CLI から楽に選択する場合は、こちらのブログも参考にしてください。
まとめ
マネコンにも不思議なパワーはなかった。