AWS Device Farm でリモートアクセスの使用状況詳細を確認する方法

2021.07.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

DeviceFarmではリモートアクセスの利用時間に応じた料金が算出されます。
しかし、確認出来るのはプラットフォーム別の合計利用時間です。

今回は、どのIAMユーザーが、どういった時間帯に、1回あたりどの程度利用しているか把握したい時、それが可能なのか確認してみました。

コスト配分タグを使う案

DeviceFarmではマネジメントコンソールからのタグ付けは出来ません。 CLIからタグ付けする操作は用意されているようです。

しかし、自動テストやデバイスプールならともかくリモートアクセスの場合は一時的なリモートセッションを使う前提なので、予め準備したタグ運用を行うのが難しいと思います。
ですので、本日はタグでどうにかするというアプローチは取りません。

自動テストの場合にコスト配分タグで出し分けできるかどうかは別の記事で検証を行いたいと思います。

実行履歴を追う案

CloudTrailで取得できる情報

Device Farmの操作履歴はCloudTrailで確認することが可能です。

us-west-2リージョンのCloudTrailでイベントソースにdevicefarm.amazonaws.comを指定してください。

誰が何の操作をしたのか確認出来ます。

イベント名:CreateRemoteAccessSessionでリモートアクセスセッションの開始イベントを取得することが出来ます。

以下の記事で7月14日にリモートアクセスセッションを作成したのですが、それが確認できますね。

イベント名:StopRemoteAccessSessionではセッション停止イベントが取得出来ます。 StopRemoteAccessSessionの実行ログは以下のように記録されています。

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "HOGEHOGE:iwasa",
        "arn": "arn:aws:sts::123456789012:assumed-role/hoge/iwasa",
        "accountId": "123456789012",
        "accessKeyId": "HOGEHOGE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAYANTVHXIFIWTJYDNB",
                "arn": "arn:aws:iam::123456789012:role/hoge",
                "accountId": "550669467088",
                "userName": "hoge"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2021-07-14T08:05:36Z",
                "mfaAuthenticated": "true"
            }
        }
    },
    "eventTime": "2021-07-14T08:12:47Z",
    "eventSource": "devicefarm.amazonaws.com",
    "eventName": "StopRemoteAccessSession",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "111.111.111.111",
    "userAgent": "aws-internal/3 cfg/retry-mode/legacy",
    "requestParameters": {
        "arn": "arn:aws:devicefarm:us-west-2:123456789012:session:df618eb6-5056-4ce9-a53a-a00c2b108656/8e0246ef-cddc-44db-827a-3b3b41d40b19/00000"
    },
    "responseElements": {
        "remoteAccessSession": {
            "name": "Apple iPhone 8",
            "remoteDebugEnabled": false,
            "remoteRecordEnabled": false,
            "arn": "arn:aws:aatp:us-west-2:123456789012:session:df618eb6-5056-4ce9-a53a-a00c2b108656/8e0246ef-cddc-44db-827a-3b3b41d40b19/00000",
            "deviceMinutes": {
                "total": 0,
                "metered": 0,
                "unmetered": 0
            },
            "result": "PENDING",
            "billingMethod": "METERED",
            "device": {
                "cpu": {
                    "clock": 0,
                    "architecture": "arm64",
                    "frequency": "Hz"
                },
                "name": "Apple iPhone 8",
                "platform": "IOS",
                "arn": "arn:aws:aatp:us-west-2::device:3A253D4FAB4B47A98FAB478CEB7D337C",
                "modelId": "{A1863,MQ6Y2,MQ6W2,MQ722,MQ842}",
                "os": "14.4.2",
                "resolution": {
                    "width": 750,
                    "height": 1334
                },
                "manufacturer": "Apple",
                "memory": 64000000000,
                "heapSize": 0,
                "model": "iPhone 8",
                "remoteDebugEnabled": true,
                "formFactor": "PHONE",
                "image": "3A253D4FAB4B47A98FAB478CEB7D337C",
                "remoteAccessEnabled": true,
                "fleetType": "PUBLIC"
            },
            "hostAddress": "172.20.158.83",
            "skipAppResign": false,
            "created": "Jul 14, 2021 8:10:54 AM",
            "status": "STOPPING"
        }
    },
    "requestID": "c6be79d2-bd6c-4dad-b84c-14066e314b0d",
    "eventID": "5a5c64e5-f362-4f3d-bc8b-1bdcbbd58f1f",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
}

ハイライトした行を特に見て欲しいのですが、実行時間はここでは確認が出来ません。

また、セッションタイムアウトの場合CloudTrailでは以下のように記録されます。

セッションタイムアウトの場合はStopRemoteAccessSessionイベントは発生しないということがわかりました。

AWS CLIで取得できる情報

get-remote-access-sessionでセッション情報の取得が可能です。

実行時の引数としてARNが必要ですが、前述したCloudTrailログから確認することが可能です。

[cloudshell-user@ip-10-0-158-199 ~]$ aws devicefarm get-remote-access-session --arn arn:aws:devicefarm:us-west-2:123456789012:session:df618eb6-5056-4ce9-a53a-a00c2b108656/8e0246ef-cddc-44db-827a-3b3b41d40b19/00000
{
    "remoteAccessSession": {
        "arn": "arn:aws:devicefarm:us-west-2:123456789012:session:df618eb6-5056-4ce9-a53a-a00c2b108656/8e0246ef-cddc-44db-827a-3b3b41d40b19/00000",
        "name": "Apple iPhone 8",
        "created": "2021-07-14T08:10:54.320000+00:00",
        "status": "COMPLETED",
        "result": "STOPPED",
        "message": "Interactive Test stopped: Stopped by request",
        "device": {
            "arn": "arn:aws:devicefarm:us-west-2::device:3A253D4FAB4B47A98FAB478CEB7D337C",
            "name": "Apple iPhone 8",
            "manufacturer": "Apple",
            "model": "iPhone 8",
            "modelId": "{A1863,MQ6Y2,MQ6W2,MQ722,MQ842}",
            "formFactor": "PHONE",
            "platform": "IOS",
            "os": "14.4.2",
            "cpu": {
                "frequency": "Hz",
                "architecture": "arm64",
                "clock": 0.0
            },
            "resolution": {
                "width": 750,
                "height": 1334
            },
            "heapSize": 0,
            "memory": 64000000000,
            "image": "3A253D4FAB4B47A98FAB478CEB7D337C",
            "remoteAccessEnabled": true,
            "remoteDebugEnabled": true,
            "fleetType": "PUBLIC"
        },
        "remoteDebugEnabled": false,
        "remoteRecordEnabled": false,
        "billingMethod": "METERED",
        "deviceMinutes": {
            "total": 5.38,
            "metered": 1.76,
            "unmetered": 0.0
        },
        "skipAppResign": false
    }
}
[cloudshell-user@ip-10-0-158-199 ~]$

"total": 5.38 これが実行時間に該当します。
実行時間はマネジメントポータル上も表示されるので、確認してみましょう。

5.38分≒5分22秒なので一致していますね。

なお、繰り返しになりますがDevice Farmは、現時点ではus-west-2(オレゴン)のみ利用可能です。
CLI実行プロファイルのリージョンもus-west-2を指定する必要がありますのでご注意ください。

us-west-2以外のリージョンで実行すると、エンドポイントへの接続に失敗します。

[cloudshell-user@ip-10-0-84-242 ~]$ aws devicefarm list-device-instances

Could not connect to the endpoint URL: "https://devicefarm.ap-northeast-1.amazonaws.com/"
[cloudshell-user@ip-10-0-84-242 ~]$

まとめ

  • 誰がいつ操作したかはCloudTrailを確認する。
  • どのくらいの時間使ったかはAWS CLIを確認する。
  • その2つはセッションARNで紐付けることが出来る。
    • ただし、StopRemoteAccessSessionはタイムアウトによる自動終了が拾えないので、CreateRemoteAccessSessionからARNと実行ユーザーを取得するのが望ましい。

これらを踏まえるとユーザー別利用量の可視化も出来そうですね。