

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# カスタムエフェメリスを使用してコンタクトを予約する
<a name="reserving-contacts-with-custom-ephemeris"></a>

## 概要:
<a name="w2aac28c19b3"></a>

 カスタムエフェメリス (TLE、OEM、または方位標高) を使用する場合は、[ReserveContact](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ReserveContact.html) API を使用してコンタクトを予約できます。このセクションでは、コンタクトを予約するための 2 つの一般的なワークフローと、コンタクトスケジューリングを成功させるための重要な考慮事項について説明します。

 AWS Ground Station アンテナは、複数のお客様間で共有されるリソースです。つまり、問い合わせを一覧表示するときに問い合わせウィンドウが使用可能になっても、別の顧客が事前に予約する場合があります。したがって、予約後に問い合わせが `SCHEDULED`状態になったことを確認し、問い合わせの状態の変化を適切にモニタリングすることが重要です。

**重要**  
 方位高度エフェメリスの場合、 `satelliteArn`パラメータを`ReserveContact`リクエストから省略できます。エフェメリス ID `trackingOverrides`を指定する必要があります。TLE および OEM エフェメリスの場合は、引き続き を指定する必要があります`satelliteArn`。

## 問い合わせ予約ワークフロー
<a name="w2aac28c19b5"></a>

 カスタムエフェメリスでコンタクトを予約するには、主に 2 つのワークフローがあります。

1. *List-then-reserve ワークフロー:* [ListContacts](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ListContacts.html) を使用して利用可能な問い合わせウィンドウを最初に一覧表示し、次に特定のウィンドウを選択して予約します。このアプローチは、選択する前に利用可能なすべての機会を確認する場合に便利です。

1. *直接予約ワークフロー:* 利用可能な連絡先を最初に一覧表示することなく、特定の時間枠の連絡先を直接予約します。このアプローチは、希望するコンタクト時間が既にわかっている場合や、事前に決められたスケジュールで作業している場合に便利です。

 どちらのワークフローも有効であり、選択は運用要件によって異なります。以下のセクションでは、各アプローチの例を示します。

## ワークフロー 1: 利用可能な連絡先を一覧表示し、予約する
<a name="w2aac28c19b7"></a>

 このワークフローは、最初に利用可能な問い合わせウィンドウをクエリし、次に特定のウィンドウを予約します。これは、選択する前に利用可能なすべての機会を表示する場合に便利です。

### 例: 方位高度エフェメリスを使用した一覧表示と予約
<a name="w2aac28c19b7b5"></a>

```
import boto3
from datetime import datetime, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

# Create azimuth elevation ephemeris
print("Creating azimuth elevation ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="AzEl Ephemeris for Contact",
    ephemeris={
        "azEl": {
            "groundStation": "Ohio 1",
            "data": {
                "azElData": {
                    "angleUnit": "DEGREE_ANGLE",
                    "azElSegmentList": [
                        {
                            "referenceEpoch": "2024-03-15T10:00:00Z",
                            "validTimeRange": {
                                "startTime": "2024-03-15T10:00:00Z",
                                "endTime": "2024-03-15T10:15:00Z",
                            },
                            "azElList": [
                                {"dt": 0.0, "az": 45.0, "el": 10.0},
                                {"dt": 180.0, "az": 50.0, "el": 15.0},
                                {"dt": 360.0, "az": 55.0, "el": 20.0},
                                {"dt": 540.0, "az": 60.0, "el": 25.0},
                                {"dt": 720.0, "az": 65.0, "el": 30.0},
                                {"dt": 900.0, "az": 70.0, "el": 35.0},
                            ],
                        }
                    ],
                }
            },
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# List available contacts
print("Listing available contacts...")
contacts = ground_station_client.list_contacts(
    # Note: satelliteArn is omitted for azimuth elevation ephemeris
    groundStation="Ohio 1",
    missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile",
    startTime=datetime(2024, 3, 15, 10, 0, 0, tzinfo=timezone.utc),
    endTime=datetime(2024, 3, 15, 10, 15, 0, tzinfo=timezone.utc),
    statusList=["AVAILABLE"],
    ephemeris={"azEl": {"id": ephemeris_id}},
)

if contacts["contactList"]:
    # Reserve the first available contact
    contact = contacts["contactList"][0]
    print(f"Reserving contact from {contact['startTime']} to {contact['endTime']}...")

    reservation = ground_station_client.reserve_contact(
        # Note: satelliteArn is omitted when using azimuth elevation ephemeris
        missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile",
        groundStation="Ohio 1",
        startTime=contact["startTime"],
        endTime=contact["endTime"],
        trackingOverrides={
            "programTrackSettings": {"azEl": {"ephemerisId": ephemeris_id}}
        },
    )

    print(f"Reserved contact: {reservation['contactId']}")
else:
    print("No available contacts found")
```

### 例: TLE エフェメリスを使用した一覧表示と予約
<a name="w2aac28c19b7b7"></a>

```
import boto3
from datetime import datetime, timedelta, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

satellite_id = "12345678-1234-1234-1234-123456789012"
satellite_arn = f"arn:aws:groundstation::111122223333:satellite/{satellite_id}"

# Create TLE ephemeris
print("Creating TLE ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="TLE Ephemeris for Contact",
    satelliteId=satellite_id,
    enabled=True,
    expirationTime=datetime.now(timezone.utc) + timedelta(days=7),
    priority=1,  # Higher priority than default ephemeris
    ephemeris={
        "tle": {
            "tleData": [
                {
                    "tleLine1": "1 25994U 99068A   24075.54719794  .00000075  00000-0  26688-4 0  9997",
                    "tleLine2": "2 25994  98.2007  30.6589 0001234  89.2782  18.9934 14.57114995111906",
                    "validTimeRange": {
                        "startTime": datetime.now(timezone.utc),
                        "endTime": datetime.now(timezone.utc) + timedelta(days=7),
                    },
                }
            ]
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# List available contacts
print("Listing available contacts...")
start_time = datetime.now(timezone.utc) + timedelta(hours=1)
end_time = start_time + timedelta(days=1)

contacts = ground_station_client.list_contacts(
    satelliteArn=satellite_arn,  # Required for TLE/OEM ephemeris
    groundStation="Hawaii 1",
    missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile",
    startTime=start_time,
    endTime=end_time,
    statusList=["AVAILABLE"],
)

if contacts["contactList"]:
    # Reserve the first available contact
    contact = contacts["contactList"][0]
    print(f"Reserving contact from {contact['startTime']} to {contact['endTime']}...")

    reservation = ground_station_client.reserve_contact(
        satelliteArn=satellite_arn,  # Required for TLE/OEM ephemeris
        missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile",
        groundStation="Hawaii 1",
        startTime=contact["startTime"],
        endTime=contact["endTime"],
        # Note: trackingOverrides is optional for TLE/OEM
        # The system will use the highest priority ephemeris automatically
    )

    print(f"Reserved contact: {reservation['contactId']}")
else:
    print("No available contacts found")
```

## ワークフロー 2: 直接連絡の予約
<a name="w2aac28c19b9"></a>

 このワークフローは、利用可能なウィンドウを最初に一覧表示することなく、問い合わせを直接予約します。このアプローチは、希望する問い合わせ時間がすでにわかっている場合や、自動スケジューリングを実装している場合に便利です。

### 例: 方位高度エフェメリスを使用した直接予約
<a name="w2aac28c19b9b5"></a>

```
import boto3
from datetime import datetime, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

# Define contact window
contact_start = datetime(2024, 3, 20, 14, 0, 0, tzinfo=timezone.utc)
contact_end = datetime(2024, 3, 20, 14, 15, 0, tzinfo=timezone.utc)

# Create azimuth elevation ephemeris for the specific contact time
print("Creating azimuth elevation ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="Direct Contact AzEl Ephemeris",
    ephemeris={
        "azEl": {
            "groundStation": "Ohio 1",
            "data": {
                "azElData": {
                    "angleUnit": "DEGREE_ANGLE",
                    "azElSegmentList": [
                        {
                            "referenceEpoch": contact_start.isoformat(),
                            "validTimeRange": {
                                "startTime": contact_start.isoformat(),
                                "endTime": contact_end.isoformat(),
                            },
                            "azElList": [
                                {"dt": 0.0, "az": 45.0, "el": 10.0},
                                {"dt": 180.0, "az": 50.0, "el": 15.0},
                                {"dt": 360.0, "az": 55.0, "el": 20.0},
                                {"dt": 540.0, "az": 60.0, "el": 25.0},
                                {"dt": 720.0, "az": 65.0, "el": 30.0},
                                {"dt": 900.0, "az": 70.0, "el": 35.0},
                            ],
                        }
                    ],
                }
            },
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# Directly reserve the contact
print(f"Reserving contact from {contact_start} to {contact_end}...")

reservation = ground_station_client.reserve_contact(
    # Note: satelliteArn is omitted for azimuth elevation
    missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile",
    groundStation="Ohio 1",
    startTime=contact_start,
    endTime=contact_end,
    trackingOverrides={"programTrackSettings": {"azEl": {"ephemerisId": ephemeris_id}}},
)

print(f"Reserved contact: {reservation['contactId']}")
```

### 例: TLE エフェメリスによる直接予約
<a name="w2aac28c19b9b7"></a>

```
import boto3
from datetime import datetime, timedelta, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

satellite_id = "12345678-1234-1234-1234-123456789012"
satellite_arn = f"arn:aws:groundstation::111122223333:satellite/{satellite_id}"

# Define contact window (based on predicted pass)
contact_start = datetime(2024, 3, 21, 10, 30, 0, tzinfo=timezone.utc)
contact_end = datetime(2024, 3, 21, 10, 42, 0, tzinfo=timezone.utc)

# Create TLE ephemeris
print("Creating TLE ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="Direct Contact TLE Ephemeris",
    satelliteId=satellite_id,
    enabled=True,
    expirationTime=contact_end + timedelta(days=1),
    priority=1,
    ephemeris={
        "tle": {
            "tleData": [
                {
                    "tleLine1": "1 25994U 99068A   24080.50000000  .00000075  00000-0  26688-4 0  9999",
                    "tleLine2": "2 25994  98.2007  35.6589 0001234  89.2782  18.9934 14.57114995112000",
                    "validTimeRange": {
                        "startTime": (contact_start - timedelta(hours=1)).isoformat(),
                        "endTime": (contact_end + timedelta(hours=1)).isoformat(),
                    },
                }
            ]
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# Directly reserve the contact
print(f"Reserving contact from {contact_start} to {contact_end}...")

reservation = ground_station_client.reserve_contact(
    satelliteArn=satellite_arn,  # Required for TLE ephemeris
    missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile",
    groundStation="Hawaii 1",
    startTime=contact_start,
    endTime=contact_end,
    # Note: trackingOverrides is optional for TLE
    # The system will use the highest priority ephemeris automatically
)

print(f"Reserved contact: {reservation['contactId']}")
```

## 問い合わせ状態の変更のモニタリング
<a name="w2aac28c19c11"></a>

 コンタクトを予約したら、その状態をモニタリングして、問題が正常に に移行`SCHEDULED`し、通知されるようにすることが重要です。 は、すべてのコンタクト状態の変更について Amazon EventBridge にイベント AWS Ground Station を発行します。

 問い合わせの状態は次のライフサイクルに従います。
+ `SCHEDULING` - コンタクトはスケジューリングのために処理中です
+ `SCHEDULED` - 問い合わせは正常にスケジュールされ、実行されます
+ `FAILED_TO_SCHEDULE` - コンタクトをスケジュールできませんでした (終了状態)

 問い合わせの状態とライフサイクルの詳細については、「」を参照してください[問い合わせのライフサイクルを理解する](contacts.lifecycle.md)。

### EventBridge を使用した問い合わせ状態モニタリングの実装
<a name="w2aac28c19c11c11"></a>

 問い合わせの状態の変化をリアルタイムでモニタリングするには、Ground Station の問い合わせの状態が変わるたびに Lambda 関数をトリガーする Amazon EventBridge ルールを設定できます。このアプローチは、問い合わせステータスをポーリングするよりも効率的でスケーラブルです。

#### 実装手順
<a name="w2aac28c19c11c11b5"></a>

1. 問い合わせ状態変更イベントを処理する Lambda 関数を作成する

1. Ground Station の問い合わせ状態変更イベントに一致する EventBridge ルールを作成する

1. ルールのターゲットとして Lambda 関数を追加する

#### Lambda 関数ハンドラーの例
<a name="w2aac28c19c11c11b7"></a>

 問い合わせ状態の変更イベントを処理する Lambda 関数の完全な例については、 `AquaSnppJpssTerraDigIF.yml` CloudFormation テンプレートの `GroundStationCloudWatchEventHandlerLambda`リソースを参照してください。このテンプレートは、 AWS Ground Station カスタマーオンボーディング Amazon S3 バケットで使用できます。このテンプレートにアクセスする手順については、データフローエンドポイントの例の[まとめる](examples.pbs-data-dataflow-endpoint.md#examples.pbs-dataflow-endpoint.putting-it-together)「」セクションを参照してください。

#### EventBridge ルール設定
<a name="w2aac28c19c11c11b9"></a>

 EventBridge ルールは、次のイベントパターンを使用して、Ground Station のすべての問い合わせ状態の変化と一致する必要があります。

```
{
  "source": ["aws.groundstation"],
  "detail-type": ["Ground Station Contact State Change"]
}
```

 特定の状態 (障害など) のみをフィルタリングするには、詳細フィルターを追加できます。

```
{
  "source": ["aws.groundstation"],
  "detail-type": ["Ground Station Contact State Change"],
  "detail": {
    "contactStatus": [
      "FAILED_TO_SCHEDULE",
      "FAILED",
      "AWS_FAILED",
      "AWS_CANCELLED"
    ]
  }
}
```

 Lambda ターゲットを使用して EventBridge ルールを作成する詳細な手順については、「Amazon EventBridge ユーザーガイド」の[「イベントに対応するルールの作成](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)」を参照してください。

### 自動化のための EventBridge ルールの設定
<a name="w2aac28c19c11c13"></a>

 EventBridge ルールを作成して、問い合わせ状態の変更に自動的に対応できます。例えば、次のようになります。
+ 問い合わせがスケジュールに失敗したときに通知を送信する
+ 問い合わせが入ったときに Lambda 関数をトリガーしてリソースを準備する `PREPASS`
+ 監査目的での問い合わせ完了のログ記録

 AWS Ground Station イベントの EventBridge ルールの設定の詳細については、「」を参照してください[イベント AWS Ground Station による自動化](monitoring.automating-events.md)。

## ベストプラクティスと考慮事項
<a name="w2aac28c19c13"></a>

### スケジュールの競合の処理
<a name="w2aac28c19c13b3"></a>

 AWS Ground Station アンテナは共有リソースであるため、 に表示される問い合わせウィンドウ`ListContacts`は、予約する前に別のお客様が予約する場合があります。これを処理するには: 

1. 予約後に常に問い合わせステータスを確認する

1. 代替時間枠を使用して再試行ロジックを実装する

1. 可能な場合は、事前に連絡先を予約することを検討してください。

1. EventBridge イベントを使用して`FAILED_TO_SCHEDULE`状態をモニタリングする

### エフェメリス検証のタイミング
<a name="w2aac28c19c13b5"></a>

 エフェメリスを使用してコンタクトを予約する前に、エフェメリスが `ENABLED`状態になっている必要があることに注意してください。検証プロセスは通常、エフェメリスのタイプとサイズに応じて数秒から数分かかります。コンタクトを予約する前に、必ずエフェメリスのステータスを確認してください。

### 問い合わせタイミングに関する考慮事項
<a name="w2aac28c19c13b7"></a>

 カスタムエフェメリスを使用する場合: 
+ エフェメリスが問い合わせ期間全体をカバーしていることを確認します。
+ 方位高度エフェメリスの場合、コンタクト全体を通して角度がアンテナを[サイトマスク](https://docs.aws.amazon.com/ground-station/latest/ug/locations.site-masks.html)の上に維持していることを確認します。
+ 将来のコンタクトをスケジュールするときにエフェメリスの有効期限を考慮する

### エフェメリスタイプ別の API の違い
<a name="w2aac28c19c13b9"></a>

 `ReserveContact` API の動作はエフェメリスタイプによって異なります。


| エフェメリスタイプ | satelliteArn 必須 | trackingOverrides 必須 | 
| --- | --- | --- | 
| TLE | はい | いいえ (オプション) | 
| OEM | はい | いいえ (オプション) | 
| 方位高度 | いいえ (オプション) | はい | 