GameWith Engineering Blog

GameWith のエンジニア、デザイナーが技術について日々発信していきます。

AWS Session Manager を Mac の Terminal から利用する

GameWith Advent Calendar 2018 6 日目担当の @serima です。

最近のマイブームはソードアート・オンライン アリシゼーションです。 SAO シリーズで一番好きなエピソードは「ファントム・バレット」で、気付いたら何度も視聴しています。

Session Manager とは

GameWith ではリモートワーク環境の実現のために AWS Session Manager を利用しています。

AWS Session Manager を利用すると、踏み台サーバが不要になります。 踏み台サーバが不要になるということは、鍵の管理から解放されるということです。

前提として以下を満たしていると、EC2 インスタンスにシェルアクセスが可能になります。

  • シェルアクセスを受け付ける EC2 インスタンスに AWS Systems Manager エージェントがインストールされている
  • EC2 インスタンスの IAM ロールに AWS 管理ポリシー AmazonEC2RoleforSSM が割り当てられている

また、弊社のセキュリティポリシー上 IAM User に MFA 設定(二段階認証)がされていない場合は AWS Session Manager を利用してシェルアクセスができないようになっています。

Session Manager 自体について、詳しくは本家の記事をご覧ください。

このポストでは 「Session Manager の導入が済んでいる状態で、どのように Terminal からシェルアクセスを行うか」についてフォーカスしたいと思います。

aws.amazon.com

Terminal からのシェルアクセス

AWS Console 上から Session Manager を利用する際は当然すでに MFA での認証は済んでいる(Console へのログイン時に確認コードが求められ、それもパスしている)状態なので問題なく利用できます。

しかし、Terminal から aws ssm コマンドを利用して Session Manager に接続しようとすると認証エラーが出てしまいます。(二段階認証ができてないので当然ですね。)

前提

手順

基本的にはこちらの記事(AWS CLI 経由で MFA を使用してアクセスを認証する)を参照していただければ問題ないと思います。

--serial-number には MFA デバイスの ARN を指定、--token-code には二段階認証のコード(6桁の数字)を指定して以下のようにコマンドを叩くと、アクセスキーとトークンが手に入ります。

% aws sts get-session-token --serial-number arn:aws:iam::000000000:mfa/username --token-code 000000 --output json
{
    "Credentials": {
        "SecretAccessKey": "XXXXXXXXXXXXXXXXX",
        "SessionToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "Expiration": "2018-10-15T21:39:58Z",
        "AccessKeyId": "XXXXXXXXXXXXX"
    }
}

取得できた SecretAccessKeySessionTokenAccessKeyId をここでは ~/.aws/credentials に以下のように追記しています。 これらのキーやトークンは一時的なもののため、期限が切れたら(デフォルトでは12時間)再設定する必要があります。

[mfa]
output = json
region = ap-northeast-1
aws_access_key_id = XXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXX
aws_session_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

その後

% aws ssm start-session --target i-someinstanceid --profile mfa

と、することで Terminal から指定したインスタンスに接続ができます。 ログイン時のユーザは ssm-user ですが sudo で昇格が可能です。(パスワードなし)

ubuntu ユーザになってからは [tab] キーでの補完が効くようになりました。

f:id:serimaryo:20181130231632p:plain

Session Manager で接続中にネットワーク切断した際の挙動

Terminal からの接続テストを行っている際に、ちょっとした実験を行いました。そちらは別記事として投稿してありますので、興味があれば、ぜひご覧ください。

qiita.com

終わりに

Session Manager は割と最近リリースされたものなのですが、インフラエンジニアの方がすかさず検証をして本運用まで導いてくれました。

GameWith では現在のところ AWS を利用していますが、最近は GCP の活用も本格的に始めています。

そのような環境下で、適材適所でクラウドベンダーを選択できるようなインフラエンジニアを募集しています!

www.wantedly.com

参考記事