Amazon EC2 インスタンスの起動 - AWS SDK for .NET (バージョン3)

本書は、 AWS SDK for .NET、主に.NET FrameworkとASP.NET 4が中心になります。x、Windows、および Visual Studio。

の最新バージョンのドキュメント https://docs.aws.amazon.com/sdk-for-net/最新/開発者ガイド/ は、主に.NET CoreとASP.NET Coreを中心としています。Windows や Visual Studio に加え、クロス・プラットフォームの開発も同じように考慮されます。

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。

Amazon EC2 インスタンスの起動

同じ Amazon Machine Image (AMI) からまったく同じに設定された 1 つ以上の Amazon EC2 インスタンスを起動するには、以下の手順を使用します。EC2 インスタンスを作成した後は、ステータスを確認できます。EC2 インスタンスが実行した後は、それに接続できます。

Amazon EC2 クライアントの作成については、「Amazon EC2 クライアントの作成」を参照してください。

EC2-Classic または VPC での EC2 インスタンスの起動

EC2-Classic または VPC でインスタンスを起動できます。EC2-Classic と EC2-VPC の詳細については、Windows インスタンスの Amazon EC2 ユーザーガイド の「サポートされているプラットフォーム」を参照してください。

セキュリティグループとその GroupId プロパティのリストを取得するには、「セキュリティグループの列挙」を参照してください。

EC2-Classic で EC2 インスタンスを起動するには

  1. RunInstancesRequest オブジェクトを作成して初期化します。指定した AMI、キーペア、およびセキュリティグループが、クライアントオブジェクトを作成したときに指定したリージョンに存在することを確認します。

    string amiID = "ami-e189c8d1"; string keyPairName = "my-sample-key"; List<string> groups = new List<string>() { mySG.GroupId }; var launchRequest = new RunInstancesRequest() { ImageId = amiID, InstanceType = InstanceType.T1Micro, MinCount = 1, MaxCount = 1, KeyName = keyPairName, SecurityGroupIds = groups };
    ImageId

    AMI の ID。パブリック AMI のリストについては、「Amazon マシンイメージ」を参照してください。

    InstanceType

    指定した AMI と互換性のあるインスタンスタイプ。詳細については、Windows インスタンスの Amazon EC2 ユーザーガイド の「インスタンスタイプ」を参照してください。

    MinCount

    起動する EC2 インスタンスの最小数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 はインスタンスを起動しません。

    MaxCount

    起動する EC2 インスタンスの最大数。これが次の数を超えるインスタンスの場合: Amazon EC2 ターゲットの可用性ゾーンで起動できます。 Amazon EC2 上で可能な最大数のインスタンスを起動します。 MinCount。 1からインスタンスタイプで許可されている最大インスタンス数まで起動できます。詳細については、Amazon EC2 の「よくある質問」の「Amazon EC2 で実行できるインスタンス数の上限は」を参照してください。

    KeyName

    EC2 キーペアの名前。キーペアを指定せずにインスタンスを起動すると、接続できません。詳細については、「Amazon EC2 のキーペアでの作業」を参照してください。

    SecurityGroupIds

    1 つ以上のセキュリティグループの識別子。詳細については、「Amazon EC2 のセキュリティグループの作成」を参照してください。

  2. (オプション) IAM ロールでインスタンスを起動するには、RunInstancesRequest オブジェクトで IAM インスタンスプロファイルを指定します。

    IAM ユーザーは、以下のポリシーによって付与されたアクセス権がないと、IAM ロールを持つインスタンスを起動できません。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:PassRole", "iam:ListInstanceProfiles", "ec2:*" ], "Resource": "*" }] }

    たとえば、次のスニペットは、winapp-instance-role-1 という名前の IAM ロールのIamInstanceProfileSpecificationオブジェクトをインスタンス化して設定します。

    var instanceProfile = new IamInstanceProfile(); instanceProfile.Id = "winapp-instance-role-1";

    RunInstancesRequest オブジェクトにこのインスタンスプロファイルを指定するには、次の行を追加します。

    launchRequest.IamInstanceProfile = instanceProfile;
  3. リクエストオブジェクトを RunInstances メソッドに渡し、インスタンスを起動します。インスタンスの管理に必要なため、インスタンスの ID を保存します。

    新しいインスタンスのインスタンス ID を取得するには、返された RunInstancesResponse オブジェクトを使用します。Reservation.Instances プロパティには、正常に起動した EC2 インスタンスごとに 1 つずつ、Instance オブジェクトリストが含まれます。Instance オブジェクトの InstanceId プロパティから、各インスタンスの ID を取得できます。

    var launchResponse = ec2Client.RunInstances(launchRequest); var instances = launchResponse.Reservation.Instances; var instanceIds = new List<string>(); foreach (Instance item in instances) { instanceIds.Add(item.InstanceId); Console.WriteLine(); Console.WriteLine("New instance: " + item.InstanceId); Console.WriteLine("Instance state: " + item.State.Name); }

EC2 インスタンスを VPC 内で起動するには

  1. VPC のサブネットで Elastic Network Interface を作成して初期化します。

    string subnetID = "subnet-cb663da2"; List<string> groups = new List<string>() { mySG.GroupId }; var eni = new InstanceNetworkInterfaceSpecification() { DeviceIndex = 0, SubnetId = subnetID, Groups = groups, AssociatePublicIpAddress = true }; List<InstanceNetworkInterfaceSpecification> enis = new List<InstanceNetworkInterfaceSpecification>() {eni};
    DeviceIndex

    ネットワークインターフェイスのアタッチメント用の、インスタンス上のデバイスのインデックス。

    SubnetId

    インスタンスを起動するサブネットの ID。

    Groups

    1 つ以上のセキュリティグループ 詳細については、「Amazon EC2 のセキュリティグループの作成」を参照してください。

    AssociatePublicIpAddress

    VPC のインスタンスにパブリック IP アドレスを自動的に割り当てるかどうかを示します。

  2. RunInstancesRequest オブジェクトを作成して初期化します。指定した AMI、キーペア、およびセキュリティグループが、クライアントオブジェクトを作成したときに指定したリージョンに存在することを確認します。

    string amiID = "ami-e189c8d1"; string keyPairName = "my-sample-key"; var launchRequest = new RunInstancesRequest() { ImageId = amiID, InstanceType = InstanceType.T1Micro, MinCount = 1, MaxCount = 1, KeyName = keyPairName, NetworkInterfaces = enis };
    ImageId

    AMI の ID。Amazon が提供しているパブリック AMI のリストについては、「Amazon マシンイメージ」を参照してください。

    InstanceType

    指定した AMI と互換性のあるインスタンスタイプ。詳細については、Windows インスタンスの Amazon EC2 ユーザーガイド の「インスタンスタイプ」を参照してください。

    MinCount

    起動する EC2 インスタンスの最小数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 はインスタンスを起動しません。

    MaxCount

    起動する EC2 インスタンスの最大数。これが次の数を超えるインスタンスの場合: Amazon EC2 ターゲットの可用性ゾーンで起動できます。 Amazon EC2 上で可能な最大数のインスタンスを起動します。 MinCount。 1からインスタンスタイプで許可されている最大インスタンス数まで起動できます。詳細については、Amazon EC2 の「よくある質問」の「Amazon EC2 で実行できるインスタンス数の上限は」を参照してください。

    KeyName

    EC2 キーペアの名前。キーペアを指定せずにインスタンスを起動すると、接続できません。詳細については、「Amazon EC2 のキーペアでの作業」を参照してください。

    NetworkInterfaces

    1 つ以上のネットワークインターフェイス。

  3. (オプション) IAM ロールでインスタンスを起動するには、RunInstancesRequest オブジェクトで IAM インスタンスプロファイルを指定します。

    IAM ユーザーは、以下のポリシーによって付与されたアクセス権がないと、IAM ロールを持つインスタンスを起動できません。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:PassRole", "iam:ListInstanceProfiles", "ec2:*" ], "Resource": "*" }] }

    たとえば、次のスニペットは、winapp-instance-role-1 という名前の IAM ロールのIamInstanceProfileSpecificationオブジェクトをインスタンス化して設定します。

    var instanceProfile = new IamInstanceProfileSpecification(); instanceProfile.Name = "winapp-instance-role-1";

    RunInstancesRequest オブジェクトにこのインスタンスプロファイルを指定するには、次の行を追加します。

    launchRequest.IamInstanceProfile = instanceProfile;
  4. リクエストオブジェクトを RunInstances メソッドに渡し、インスタンスを起動します。インスタンスの管理に必要なので、インスタンスの ID を保存します。

    新しいインスタンスのインスタンス ID リストを取得するには、返された RunInstancesResponse オブジェクトを使用します。Reservation.Instances プロパティには、正常に起動した EC2 インスタンスごとに 1 つずつ、Instance オブジェクトリストが含まれます。Instance オブジェクトの InstanceId プロパティから、各インスタンスの ID を取得できます。

    RunInstancesResponse launchResponse = ec2Client.RunInstances(launchRequest); List<String> instanceIds = new List<string>(); foreach (Instance instance in launchResponse.Reservation.Instances) { Console.WriteLine(instance.InstanceId); instanceIds.Add(instance.InstanceId); }

インスタンスの状態の確認

インスタンスの現在の状態を取得するには、以下の手順を使用します。最初、インスタンスの状態は pending です。インスタンスが running 状態になった後、インスタンスに接続できます。

  1. DescribeInstancesRequest オブジェクトを作成して設定し、インスタンスのインスタンス ID を InstanceIds プロパティに割り当てます。また、Filter プロパティを使用して、特定のユーザー指定タグを持つインスタンスなど、特定のインスタンスへのリクエストを制限できます。

    var instanceRequest = new DescribeInstancesRequest(); instanceRequest.InstanceIds = new List<string>(); instanceRequest.InstanceIds.Add(instanceId);
  2. DescribeInstances メソッドを呼び出してから、ステップ 1 のリクエストオブジェクトを渡します。メソッドでは、インスタンスに関する情報を含む DescribeInstancesResponse オブジェクトを返します。

    var response = ec2Client.DescribeInstances(instanceRequest);
  3. DescribeInstancesResponse.Reservations プロパティには予約のリストが含まれます。この場合、予約は 1 つのみです。各予約には、Instance オブジェクトのリストが含まれます。この場合、インスタンスはやはり 1 つのみです。インスタンスのステータスは State プロパティから取得できます。

    Console.WriteLine(response.Reservations[0].Instances[0].State.Name);

実行中のインスタンスへの接続

インスタンスが実行状態になった後、適切なリモートクライアントを使用してリモート接続できます。

Linux インスタンスの場合は、SSH クライアントを使用します。インスタンスの SSH ポート (22) がトラフィックに対して開かれていることを確認する必要があります。インスタンスのパブリック IP アドレスまたはパブリック DNS 名に加えて、インスタンスの起動に使用されたキーペアのプライベート部分が必要です。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイド の「Linux インスタンスへの接続」を参照してください。

Windows インスタンスの場合は、RDP クライアントを使用します。インスタンスの RDP ポート (3389) がトラフィックに対して開かれていることを確認する必要があります。インスタンスのパブリック IP アドレスまたは DNS 名に加えて、管理者パスワードが必要です。管理者パスワードは、GetPasswordData および GetPasswordDataResult.GetDecryptedPassword メソッドで取得します。これらのメソッドには、インスタンスの起動に使用したキーペアのプライベート部分が必要です。詳細については、Windows インスタンスの Amazon EC2 ユーザーガイド の「RDP を使用して Windows インスタンスに接続する」を参照してください。次の例では、Windows インスタンスのパスワードを取得する方法を示します。

public static string GetWindowsPassword( AmazonEC2Client ec2Client, string instanceId, FileInfo privateKeyFile) { string password = ""; var request = new GetPasswordDataRequest(); request.InstanceId = instanceId; var response = ec2Client.GetPasswordData(request); if (null != response.PasswordData) { using (StreamReader sr = new StreamReader(privateKeyFile.FullName)) { string privateKeyData = sr.ReadToEnd(); password = response.GetDecryptedPassword(privateKeyData); } } else { Console.WriteLine("The password is not available. The password for " + "instance {0} is either not ready, or it is not a Windows instance.", instanceId); } return password; }

EC2 インスタンスが必要なくなったときは、「Amazon EC2 インスタンスの削除」を参照してください。