AWS Systems Manager を使って no-ingress EC2 インスタンスをアクセスする - AWS Cloud9

AWS Systems Manager を使って no-ingress EC2 インスタンスをアクセスする

EC2 環境用に作成された「no-ingress EC2 インスタンス」により、AWS Cloud9 がそのインスタンスのインバウンドポートを開かなくても、その Amazon EC2 インスタンスへの接続が有効になります。コンソールコマンドラインインターフェイス、またはAWS CloudFormation スタックを使って、EC2 環境を作成するときに、no-ingress オプションを選択できます。

重要

Systems Manager Session Manager 使って EC2 インスタンスへの接続を管理する場合、追加料金は発生しません。


            ご使用の環境に新しいno-ingress EC2 インスタンスを選択する

環境タイプをコンソールの環境設定のセクションで選択すると、インバウンド接続を必要とする新たな EC2 インスタンスまたはそれを必要としない新しい no-ingress EC2 インスタンスを選択できます。

注記

また、3 番目のオプションとしてリモートサーバーで作成して実行します (SSH 接続)既存の EC2 インスタンスまたは独自のサーバーへの AWS Cloud9 接続の詳細については、「SSH 環境を作成する」を参照してください。

AWS CLI を使用して環境を作成する場合、create-environment-ec2 コマンドを呼び出す時に、--connection-type CONNECT_SSM オプションを設定して、no-ingress EC2 インスタンスを設定できます。必要なサービスロールとインスタンスプロファイルの作成に関する詳細については、「AWS CLI を使ったSystems Manager のインスタンスプロファイルの管理」を参照してください。

no-ingress EC2 インスタンスを使用する環境の作成が完了したら、以下を確認します。

EC2 環境でSystems Manager を使用する利点

Session Manager に、AWS Cloud9 とその EC2 インスタンスの間でセキュアな接続を処理する許可を与えると、次の 2 つのキーとなる利点が生まれます。

  • インスタンスのインバウンドポートを開く必要がない

  • パブリックサブネットまたはプライベートサブネットでインスタンスを起動するオプション

No open inbound ports

AWS Cloud9 とその EC2 インスタンスの間の安全な接続は、Session Manager が処理します。Session Manager は、フルマネージド Systems Manager 機能であり、AWS Cloud9 がインバウンドポートを開けなくてもその EC2 インスタンスに接続できる機能を有効にします。

重要

no-ingress 接続に Systems Manager を使用するオプションは、現在、新しい EC2 環境を作成する場合にのみ使用できます。

Session Manager セッションがスタートすると、ターゲットインスタンスへの接続が行われます。接続を確立すると、環境は Systems Manager サービスを通じてインスタンスと対話できるようになります。Systems Manager サービスは、Systems Manager Agent (SSM Agent) を通じてインスタンスと通信を行います。

SSM Agent は、デフォルトでは、EC2 環境によって使用されるすべてのインスタンスにインストールされます。

Private/public subnets

インスタンスのサブネットをネットワーク 設定 (アドバンスト) セクションで選択する時は、ご使用の環境のインスタンスに Systems Manager 経由でアクセスする場合は、プライベートサブネットまたはパブリックサブネットを選択できます。


                            ご使用の環境に新しいno-ingress EC2 インスタンスを選択する

プライベートサブネット

プライベートサブネットの場合、インスタンスが SSM サービスにまだ接続できることを確認する必要があります。これは、パブリックサブネットに NAT ゲートウェイを設定するまたは Systems Manager の VPC エンドポイントの設定。によって行うことができます。

NAT ゲートウェイを使用する利点は、インターネットがプライベートサブネット内のインスタンスへの接続を開始できなくなることです。環境のインスタンスにはパブリック IP アドレスではなくプライベート IP アドレスが割り当てられているため、NAT ゲートウェイはインスタンスからインターネットまたはその他の AWS サービスに接続して、レスポンスをインスタンスに送り返します。

VPC オプションでは、Systems Manager に、com.amazonaws.region.ssmcom.amazonaws.region.ec2メッセージ、 およびcom.amazonaws.region.ssmessagesと、少なくとも 3 つのインターフェイスエンドポイントを作成する必要があります。詳細については、AWS Systems Manager ユーザーガイドの「Systems Manager の VPC エンドポイントを作成する」を参照してください。

重要

現在、環境の EC2 インスタンスがプライベートサブネットに起動されている場合、AWS エンティティを代表して、AWSマネージド一時認証情報を使用して、EC2 環境が AWS サービスにアクセスする許可をだすことはできません(例えば、IAM ユーザー)。

パブリックサブネット

開発環境が SSM を使用して EC2 インスタンスにアクセスしている場合は、起動先のパブリックサブネットで、インスタンスがパブリック IP アドレスに割り当てられていることを確認します。これを行うには、独自の IP アドレスを指定するか、パブリック IP アドレスの自動割り当てを有効にします。自動割り当て IP 設定を変更する時に含まれる指示については、Amazon VPC ユーザーガイド内のVPC の IP アドレス指定を参照してください。

環境インスタンスのプライベートサブネットとパブリックサブネットの設定の詳細については、「AWS Cloud9 の サブネットの作成」を参照してください。

Systems Manager 許可の管理

デフォルトでは、Systems Manager には、EC2 インスタンス上でアクションを実行する許可がありません。アクセスは AWS Identity and Access Management (IAM) インスタンスプロファイルを通じて提供されます。(インスタンスプロファイルは、起動時に EC2 インスタンスに IAM ロール情報を渡すコンテナです。)

AWS Cloud9 コンソールを使って no-ingress EC2 インスタンスを作成する時に、サービスロール (AWSCloud9SSMAccessRole) とIAM インスタンスプロファイル (AWSCloud9SSMInstanceProfile) の両方がユーザーのため、自動的に作成されます。(IAM マネジメントコンソールで AWSCloud9SSMAccessRole を表示できます。 インスタンスプロファイルは IAM コンソールに表示されません)。

重要

AWS CLI を使って no-ingress EC2 環境を初めて作成するのであれば、必要なサービスロールとインスタンスプロファイルを明示的に定義する必要があります。詳細については、「AWS CLI を使ったSystems Manager のインスタンスプロファイルの管理」を参照してください。

セキュリティ保護を強化するために、AWS Cloud9 サービスにリンクされたロール、AWSServiceRoleforAWSCloud9は、AWSCloud9ServiceRolePolicy ポリシーにある PassRole 制限を特徴としています。IAM ロールをサービスにPass (適用) すると、そのサービスがロールを引き受け、ユーザーに代わってアクションを実行できる許可がでます。この場合は、PassRole 許可により、AWS Cloud9 が AWSCloud9SSMAccessRole ロール (およびその許可)を適用できるのは、 EC2 インスタンスだけになります。これにより、EC2 インスタンスで実行できるアクションは、AWS Cloud9 で求められているもののみに限定されます。

注記

Systems Manager を使用してインスタンスにアクセスする必要がなくなった場合は、AWSCloud9SSMAccessRole サービスロールを削除できます。詳細については、IAM ユーザーガイドの「ロールまたはインスタンスプロファイルを削除する」を参照してください。

AWS CLI を使ったSystems Manager のインスタンスプロファイルの管理

また、AWS CLI を使って no-ingress EC2 環境を作成できます。create-environment-ec2 を呼び出すとき、--connection-typeオプションをCONNECT_SSM に設定します。

このオプションを使用する場合、AWSCloud9SSMAccessRole サービスロールと AWSCloud9SSMInstanceProfile は自動的に作成されません。だから、必要なサービスプロファイルとインスタンスプロファイルを作成するには、次のいずれかを行います。

  • コンソールを使って EC2 環境を作成すると、その後は自動的に AWSCloud9SSMAccessRole サービスロールと AWSCloud9SSMInstanceProfile が自動的に作成されます。作成後、サービスロールとインスタンスプロファイルは、AWS CLI を使って作成した追加 EC2 環境で利用できます。

  • 次の AWS CLI コマンドを実行して、サービスロールとインスタンスプロファイルを作成します。

    aws iam create-role --role-name AWSCloud9SSMAccessRole --path /service-role/ --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": ["ec2.amazonaws.com","cloud9.amazonaws.com"] },"Action": "sts:AssumeRole"}]}' aws iam attach-role-policy --role-name AWSCloud9SSMAccessRole --policy-arn arn:aws:iam::aws:policy/AWSCloud9SSMInstanceProfile aws iam create-instance-profile --instance-profile-name AWSCloud9SSMInstanceProfile --path /cloud9/ aws iam add-role-to-instance-profile --instance-profile-name AWSCloud9SSMInstanceProfile --role-name AWSCloud9SSMAccessRole

Session Manager によって管理されているインスタンスへのアクセスをユーザーに与える

Systems Manager を介して EC2 インスタンスに接続しているAWS Cloud9 環境を開くには、ユーザーに API オペレーションの許可である StartSession がおりている必要があります。このオペレーションにより、Session Manager セッション用マネージド EC2 インスタンスへの接続が開始されます。AWS Cloud9 特定のマネージドポリシー (推奨) を使用するか、IAM ポリシーを編集して必要なアクセス権限を追加して、ユーザーにアクセス権を付与します。

方法 説明書

AWS Cloud9 固有のマネージドポリシーを使用する

以下を使用することをお勧めします。AWS マネージドポリシーを使用して、Systems Manager が管理する EC2 インスタンスへのユーザーのアクセスを許可します。マネージドポリシーは、スタンダード AWS Cloud9 ユースケースを使用しており、IAM エンティティに簡単に添付できます。

すべてのマネージドポリシーには、StartSessionAPI オペレーションを実行する許可も含まれています。次にあげるのは、AWS Cloud9 固有のマネージドポリシーです。

  • AWSCloud9Administrator (arn:aws:iam::aws:policy/AWSCloud9Administrator)

  • AWSCloud9User (arn:aws:iam::aws:policy/AWSCloud9User)

  • AWSCloud9EnvironmentMember (arn:aws:iam::aws:policy/AWSCloud9EnvironmentMember)

詳細については、「AWS Cloud9 用 AWS マネージドポリシー」を参照してください。

IAM ポリシーを編集し、必要なポリシーステートメントを追加する

既存のポリシーを編集するため、StartSessionAPI 用許可を追加できます。AWS Management Console または AWS CLI を使用してポリシーを編集するには、IAM ユーザーガイド内のIAM ポリシーの編集が提供する指示に従います。

ポリシーを編集するときに、ssm:startSession API オペレーションの実行を許可する policy statement (以下を参照) を追加します。

次の許可を使用すると、StartSession API オペレーションの実行が有効になります。インスタンスがAWS Cloud9 EC2 開発環境 (aws:cloud9:environment)という条件で、ssm:resourceTag 条件キーは、Session Manager セッションを任意のインスタンス (Resource: arn:aws:ec2:*:*:instance/*) のためにスタートできます。

注記

次のマネージドポリシーには、AWSCloud9AdministratorAWSCloud9User、およびAWSCloud9EnvironmentMember というポリシーステートメントも含まれています。

{ "Effect": "Allow", "Action": "ssm:StartSession", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringLike": { "ssm:resourceTag/aws:cloud9:environment": "*" }, "StringEquals": { "aws:CalledViaFirst": "cloud9.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "ssm:StartSession" ], "Resource": [ "arn:aws:ssm:*:*:document/*" ] }

AWS CloudFormation を使用して、no-ingress EC2 環境を作成する

AWS CloudFormationテンプレートを使用して、no-ingress Amazon EC2 開発環境を定義する場合は、スタックを作成する前に次のことを行います。

  1. AWSCloud9SSMAccessRole サービスロールとAWSCloud9SSMInstanceProfile インスタンスプロファイルを作成します。詳細については、「AWS CloudFormation テンプレートでサービスロールとインスタンスプロファイルを作成する」を参照してください。

  2. AWS CloudFormation を呼び出す IAM エンティティのポリシーを更新して、EC2 インスタンスに接続する Session Manager セッションをスタートできます。詳細については、「IAM ポリシーに Systems Manager 許可を追加する」を参照してください。

AWS CloudFormation テンプレートでサービスロールとインスタンスプロファイルを作成する

サービスロール AWSCloud9SSMAccessRole とインスタンスプロファイル AWSCloud9SSMInstanceProfileを作成して、Systems Manager による開発環境をバックアップする EC2 インスタンスの管理を有効にします。

no-ingress EC2 環境 with the console を作成またはAWS CLI コマンドの実行によって、AWSCloud9SSMAccessRole および AWSCloud9SSMInstanceProfile を以前に作成済みである場合は、サービスロールとインスタンスプロファイルはすでに使用可能です。

注記

必要なサービスロールとインスタンスプロファイルを最初に作成せずに、no-ingress EC2 環境の AWS CloudFormation スタックを作成しようとすると、スタックは作成されず、次のエラーメッセージが表示されます。

インスタンスプロファイル AWSCloud9SSMinStanceProfile がアカウントに存在しません。

AWS CloudFormation を使って no-ingress EC2 環境を初めて作成する場合、テンプレートで AWSCloud9SSMAccessRole および AWSCloud9SSMInstanceProfile を IAM リソースとして定義します。

サンプルテンプレートからの抜粋は、これらのリソースを定義する方法を示しています。(AssumeRoleアクションは、アクセスをAWS Cloud9 環境とそのEC2 インスタンスの両方に提供するセキュリティ認証情報を返します。)

AWSTemplateFormatVersion: 2010-09-09 Resources: AWSCloud9SSMAccessRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - cloud9.amazonaws.com - ec2.amazonaws.com Action: - 'sts:AssumeRole' Description: 'Service linked role for AWS Cloud9' Path: '/service-role/' ManagedPolicyArns: - arn:aws:iam::aws:policy/AWSCloud9SSMInstanceProfile RoleName: 'AWSCloud9SSMAccessRole' AWSCloud9SSMInstanceProfile: Type: "AWS::IAM::InstanceProfile" Properties: InstanceProfileName: AWSCloud9SSMInstanceProfile Path: "/cloud9/" Roles: - Ref: AWSCloud9SSMAccessRole

IAM ポリシーに Systems Manager 許可を追加する

AWS CloudFormationテンプレートサービスロールとインスタンスプロファイルの定義した後、スタックを作成する IAM エンティティに Session Manager セッションをスタートする許可があることも確認する必要があります。(セッションは、Session Manager を使用した EC2 インスタンス への接続です。)

注記

no-ingress EC2 環境用のスタックを作成する前に Session Manager セッションをスタートする許可を追加しない場合、AccessDeniedException エラーが返されます。

AWS CloudFormation を呼び出すため、次の許可を IAM エンティティのポリシーに追加します。

{ "Effect": "Allow", "Action": "ssm:StartSession", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringLike": { "ssm:resourceTag/aws:cloud9:environment": "*" }, "StringEquals": { "aws:CalledViaFirst": "cloudformation.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "ssm:StartSession" ], "Resource": [ "arn:aws:ssm:*:*:document/*" ] }

依存関係をダウンロードするため、Amazon S3 の VPC エンドポイントを設定する

もし AWS Cloud9 環境の EC2 インスタンスがインターネットにアクセスできない場合 (アウトバウンドトラフィックは許可されません)、指定した Amazon S3 バケットの VPC エンドポイントを作成する必要があります。このバケットには、IDE を最新の状態に保つために必要な依存関係が含まれています。

Amazon S3 の VPC エンドポイントを設定するには、アクセスポリシーをカスタマイズして、ダウンロードする依存関係を含む信頼されたバケットのみへのアクセスを許可します。

注記

AWS Management Console、AWS CLI、または Amazon VPC API を使用して、VPC エンドポイントを作成および設定できます。以下の手順では、コンソールインターフェイスを使用して VPC エンドポイントを作成する方法について説明します。

Amazon S3 の VPC エンドポイントを作成および設定する

  1. AWS Management Console ではい、Amazon VPC のコンソールページに移動します。

  2. ナビゲーションバーで、[エンドポイント] を選択します。

  3. エンドポイントページで、[エンドポイント作成]を選択します。

  4. エンドポイントの作成ページで、検索フィールドに「s3」と入力し、戻るを押して、現在のAWSリージョンで、Amazon S3 で利用可能なエンドポイントをリストします。

  5. 返却された Amazon S3 エンドポイントのリストから、ゲートウェイタイプを選択できます。

  6. 次に、環境の EC2 インスタンスが含まれている VPC を選択します。

  7. 今度は、関連付けられたサブネットがエンドポイントにアクセスできるように、VPC のルートテーブルを選択します。(環境の EC2 インスタンスは、これらのサブネットの 1 つにあります)。

  8. ポリシーセクションで、カスタムオプションを選択し、スタンダードポリシーを以下に置き換えます。

    { "Version": "2008-10-17", "Statement": [ { "Sid": "Access-to-C9-bucket-only", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::{bucket_name}/content/dependencies/*" } ] }

    Resource要素に対して、AWS リージョンで {bucket_name} を利用可能なバケットの実際の名前に置き換えます。例えば、AWS Cloud9欧州 (アイルランド) リージョンで、以下を指定します: "Resource": "arn:aws:s3:::static-eu-west-1-prod-static-hld3vzaf7c4h/content/dependencies/

    以下の表にAWS Cloud9が利用可能となるAWSリージョンのバケット名を示します。

    AWS Cloud9リージョンの Amazon S3 バケット
    AWS 地域 バケット名 

    米国東部 (オハイオ)

    static-us-east-2-prod-static-1c3sfcvf9hy4m

    米国東部(バージニア北部)

    static-us-east-1-prod-static-mft1klnkc4hl

    米国西部 (オレゴン)

    static-us-west-2-prod-static-p21mksqx9zlr

    アジアパシフィック (香港)

    static-ap-east-1-prod-static-171xhpfkrorh6

    アジアパシフィック (ムンバイ)

    static-ap-south-1-prod-static-ykocre202i9d

    アジアパシフィック (ソウル)

    static-ap-northeast-2-prod-static-1wxyctlhwiajm

    アジアパシフィック (シドニー)

    static-ap-southeast-2-prod-static-1cjsl8bx27rfu

    アジアパシフィック (東京)

    static-ap-northeast-1-prod-static-4fwvbdisquj8

    カナダ (中部)

    static-ca-central-1-prod-static-g80lpejy486c

    欧州 (フランクフルト)

    static-eu-central-1-prod-static-14lbgls2vrkh

    欧州 (アイルランド)

    static-eu-west-1-prod-static-hld3vzaf7c4h

    欧州 (ロンドン)

    static-eu-west-2-prod-static-36lbg202837x

    ヨーロッパ (ミラノ)

    static-eu-south-1-prod-static-1379tzkd3ni7d

    欧州 (パリ)

    static-eu-west-3-prod-static-1rwpkf766ke58

    欧州 (ストックホルム)

    static-eu-north-1-prod-static-1qzw982y7yu7e

    中東 (バーレーン)

    static-me-south-1-prod-static-gmljex38qtqx

    南米 (サンパウロ)

    static-sa-east-1-prod-static-1cl8k0y7opidt

  9. Create endpoint] (エンドポイントの作成) を選択します。

    正しい設定情報を指定した場合は、作成されたエンドポイントの ID がメッセージに表示されます。

  10. IDE が Amazon S3 バケットにアクセスできることをチェックするには、メニューバー上の[Window]、[New Terminal (新しいターミナル)] を選択してターミナルセッションをスタートします。次に、以下のコマンドを実行し、{bucket_name} をリージョンのバケットの実際の名前に置き換えます。

    ping {bucket_name}.s3.{region}.amazonaws.com.

    例えば、米国東部 (バージニア北部) リージョンで Amazon S3 バケットのエンドポイントを作成した場合は、次のコマンドを実行します。

    ping static-us-east-1-prod-static-mft1klnkc4hl.s3.us-east-1.amazonaws.com

    ping が応答を受け取ると、IDE がバケットとその依存関係にアクセスできることを確認します。

この特徴の詳細については、AWSPrivateLink ガイドにあるAmazon S3 用エンドポイントを参照してください。

プライベート接続用 VPC エンドポイントの設定

Systems Manager 経由のアクセスオプションを使用して、インスタンスをサブネットに起動する時には、セキュリティグループには受信ネットワークトラフィックを許可するインバウンドルールがありません。ただし、セキュリティグループには、インスタンスからのアウトバウンドトラフィックを許可するアウトバウンドルールがあります。AWS Cloud9 IDE を最新状態で保つには、パッケージとライブラリをダウンロードするためにこうする必要があります。

インスタンスのアウトバウンドトラフィックとインバウンドトラフィックを防ぐには、Systems Manager 用の Amazon VPC エンドポイントを作成して設定する必要があります。インターフェイス VPC エンドポイント (インターフェイスエンドポイント) を使用すると、AWS PrivateLink によって提供されるサービスに接続できます。これは、プライベート IP アドレスを使用して Amazon EC2 および Systems Manager API にプライベートアクセスを許可するテクノロジーです。VPC エンドポイントを設定して Systems Manager を使用するには、このナレッジセンターのリソースが提供する指示に従います。

警告

インバウンドまたはアウトバウンドのネットワークトラフィックを許可しないセキュリティグループを設定する場合、AWS Cloud9 IDE をサポートする EC2 インスタンスは、デフォルトではインターネットにアクセスできません。したがって、VPC の Amazon S3 エンドポイントを作成して、信頼できる S3 バケットに含まれる依存関係へのアクセスを許可する必要があります。さらに、AWS Lambda 関数など、一部の AWS サービスは、インターネットアクセスなしでは意図したとおりに動作しないかもしれません。

AWSPrivateLink を使うと、トラフィックのソースまたは送信先とは関係なく、VPC エンドポイントを経由して処理される各ギガバイトごとにデータ処理料金が発生します。詳細については、「AWS PrivateLink の料金」を参照してください。