

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# `AWSSupport-TroubleshootEKSNetwork`
<a name="automation-awssupport-troubleshooteksnetwork"></a>

## Deskripsi
<a name="automation-awssupport-troubleshooteksnetwork-description"></a>

`AWSSupport-TroubleshootEKSNetwork`Runbook membantu Anda memecahkan masalah konektivitas jaringan dalam wadah yang berjalan di cluster Amazon Elastic Kubernetes Service (Amazon EKS). Runbook mengumpulkan statistik komputasi dan jaringan dari sumber lalu lintas dan tujuan, tergantung pada jenis tujuan.

## Cara kerjanya
<a name="automation-awssupport-troubleshooteksnetwork-how-it-works"></a>

Gunakan runbook ini untuk memecahkan masalah konektivitas ke jenis tujuan berikut:
+ **POD**: Kubernetes Pod lain.
+ **LAYANAN**: Sebuah Kubernetes layanan.
+ **IP**: IPv4/IPv6 Alamat, internal atau eksternal ke cluster atau Amazon VPC.
+ **DNS**: Nama domain, internal atau eksternal ke cluster atau Amazon VPC.

**penting**  
Selain izin IAM berikut, AutomationAssumeRole harus memiliki akses ke cluster Amazon EKS menggunakan metode [ akses API Amazon EKS yang ](https://docs.aws.amazon.com/eks/latest/userguide/grant-k8s-access.html) didukung. Untuk cluster yang menggunakan entri akses, kebijakan `AmazonEKSViewPolicy` akses adalah kebijakan minimum yang diperlukan.

 [Jalankan Otomatisasi ini (konsol) ](https://console.aws.amazon.com/systems-manager/automation/execute/AWSSupport-TroubleshootEKSNetwork) 

## Izin IAM yang diperlukan
<a name="automation-awssupport-troubleshooteksnetwork-permissions"></a>

`AutomationAssumeRole`Parameter memerlukan tindakan berikut untuk menggunakan runbook dengan sukses.

Runbook ini menjalankan runbook `AWSSupport-CollectEKSLinuxNodeStatistics` anak di bawah peran yang sama. `AWSSupport-SetupK8sApiProxyForEKS` Anda `AutomationAssumeRole` harus mengizinkan tindakan berikut untuk runbook induk dan anak:
+ `cloudformation:CreateStack`
+ `cloudformation:DeleteStack`
+ `cloudformation:DescribeStackResources`
+ `cloudformation:DescribeStacks`
+ `cloudformation:UpdateStack`
+ `ec2:CreateNetworkInterface`
+ `ec2:DeleteNetworkInterface`
+ `ec2:DescribeInstances`
+ `ec2:DescribeNetworkInterfaces`
+ `ec2:DescribeRegions`
+ `ec2:DescribeRouteTables`
+ `ec2:DescribeSecurityGroups`
+ `ec2:DescribeSubnets`
+ `ec2:DescribeVpcPeeringConnections`
+ `ec2:DescribeVpcs`
+ `eks:DescribeCluster`
+ `eks:DescribeFargateProfile`
+ `iam:AttachRolePolicy`
+ `iam:CreateRole`
+ `iam:DeleteRole`
+ `iam:DeleteRolePolicy`
+ `iam:DetachRolePolicy`
+ `iam:GetRole`
+ `iam:PassRole`
+ `iam:PutRolePolicy`
+ `iam:TagRole`
+ `iam:UntagRole`
+ `lambda:CreateFunction`
+ `lambda:DeleteFunction`
+ `lambda:GetFunction`
+ `lambda:InvokeFunction`
+ `lambda:ListTags`
+ `lambda:TagResource`
+ `lambda:UntagResource`
+ `lambda:UpdateFunctionCode`
+ `lambda:UpdateFunctionConfiguration`
+ `logs:CreateLogGroup`
+ `logs:CreateLogStream`
+ `logs:DeleteLogGroup`
+ `logs:DescribeLogGroups`
+ `logs:DescribeLogStreams`
+ `logs:ListTagsForResource`
+ `logs:PutLogEvents`
+ `logs:PutRetentionPolicy`
+ `logs:TagResource`
+ `logs:UntagResource`
+ `s3:GetBucketLocation`
+ `s3:GetObject`
+ `s3:PutObject`
+ `ssm:DescribeAutomationExecutions`
+ `ssm:DescribeAutomationStepExecutions`
+ `ssm:DescribeDocument`
+ `ssm:DescribeInstanceInformation`
+ `ssm:GetAutomationExecution`
+ `ssm:GetCommandInvocation`
+ `ssm:GetDocument`
+ `ssm:ListCommands`
+ `ssm:SendCommand`
+ `ssm:StartAutomationExecution`
+ `sts:GetCallerIdentity`
+ `tag:GetResources`
+ `tag:TagResources`

Kebijakan contoh berikut menunjukkan izin hak istimewa terkecil yang diperlukan untuk. `AutomationAssumeRole` Ganti`REGION`,`ACCOUNTID`,`SOURCE_CLUSTER_NAME`,`DESTINATION_CLUSTER_NAME`, dan `S3_BUCKET_NAME` dengan nilai-nilai Anda sendiri:

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EKSClusterAccess",
            "Effect": "Allow",
            "Action": "eks:DescribeCluster",
            "Resource": [
                "arn:aws:eks:{{REGION}}:{{ACCOUNTID}}:cluster/{{SOURCE_CLUSTER_NAME}}",
                "arn:aws:eks:{{REGION}}:{{ACCOUNTID}}:cluster/{{DESTINATION_CLUSTER_NAME}}"
            ]
        },
        {
            "Sid": "EKSFargateProfileAccess",
            "Effect": "Allow",
            "Action": "eks:DescribeFargateProfile",
            "Resource": [
                "arn:aws:eks:{{REGION}}:{{ACCOUNTID}}:fargateprofile/{{SOURCE_CLUSTER_NAME}}/*",
                "arn:aws:eks:{{REGION}}:{{ACCOUNTID}}:fargateprofile/{{DESTINATION_CLUSTER_NAME}}/*"
            ]
        },
        {
            "Sid": "EC2DescribePermissions",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeRegions",
                "ec2:DescribeRouteTables",
                "ec2:DescribeVpcs",
                "ec2:DescribeVpcPeeringConnections",
                "ec2:DescribeSubnets"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "{{REGION}}"
                }
            }
        },
        {
            "Sid": "SSMAutomationExecution",
            "Effect": "Allow",
            "Action": [
                "ssm:StartAutomationExecution",
                "ssm:GetAutomationExecution",
                "ssm:DescribeAutomationExecutions",
                "ssm:DescribeAutomationStepExecutions"
            ],
            "Resource": "arn:aws:ssm:{{REGION}}:{{ACCOUNTID}}:automation-execution/*"
        },
        {
            "Sid": "SSMDocumentAccess",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeDocument",
                "ssm:GetDocument"
            ],
            "Resource": [
                "arn:aws:ssm:{{REGION}}:{{ACCOUNTID}}:document/AWSSupport-TroubleshootEKSNetwork",
                "arn:aws:ssm:{{REGION}}:{{ACCOUNTID}}:document/AWSSupport-SetupK8sApiProxyForEKS",
                "arn:aws:ssm:{{REGION}}:{{ACCOUNTID}}:document/AWSSupport-CollectEKSLinuxNodeStatistics",
                "arn:aws:ssm:{{REGION}}:*:document/AWS-RunShellScript"
            ]
        },
        {
            "Sid": "SSMRunCommandOnNodes",
            "Effect": "Allow",
            "Action": [
                "ssm:SendCommand",
                "ssm:GetCommandInvocation"
            ],
            "Resource": [
                "arn:aws:ec2:{{REGION}}:{{ACCOUNTID}}:instance/*",
                "arn:aws:ssm:{{REGION}}:*:document/AWS-RunShellScript"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/eks:cluster-name": [
                        "{{SOURCE_CLUSTER_NAME}}",
                        "{{DESTINATION_CLUSTER_NAME}}"
                    ]
                }
            }
        },
        {
            "Sid": "S3TroubleshootingAssets",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::{{S3_BUCKET_NAME}}/AWSSupport-CollectEKSLinuxNodeStatistics/*"
        },
        {
            "Sid": "S3BucketLocation",
            "Effect": "Allow",
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::{{S3_BUCKET_NAME}}"
        },
        {
            "Sid": "LambdaK8sProxyManagement",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:GetFunction",
                "lambda:InvokeFunction",
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": "arn:aws:lambda:{{REGION}}:{{ACCOUNTID}}:function:Automation-K8sProxy-*"
        },
        {
            "Sid": "CloudFormationK8sProxyStack",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeStacks",
                "cloudformation:DescribeStackResources"
            ],
            "Resource": "arn:aws:cloudformation:{{REGION}}:{{ACCOUNTID}}:stack/AWSSupport-SetupK8sApiProxyForEKS-*/*"
        },
        {
            "Sid": "IAMForK8sProxyLambdaRole",
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:GetRole",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy"
            ],
            "Resource": "arn:aws:iam::{{ACCOUNTID}}:role/Automation-K8sProxy-Role-*"
        },
        {
            "Sid": "IAMPassRoleToLambda",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::{{ACCOUNTID}}:role/Automation-K8sProxy-Role-*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "lambda.amazonaws.com"
                }
            }
        },
        {
            "Sid": "CloudWatchLogsForK8sProxy",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DeleteLogGroup"
            ],
            "Resource": "arn:aws:logs:{{REGION}}:{{ACCOUNTID}}:log-group:/aws/lambda/Automation-K8sProxy-*"
        },
        {
            "Sid": "ResourceTaggingForStackLookup",
            "Effect": "Allow",
            "Action": "tag:GetResources",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "{{REGION}}"
                }
            }
        },
        {
            "Sid": "STSCallerIdentity",
            "Effect": "Allow",
            "Action": "sts:GetCallerIdentity",
            "Resource": "*"
        }
    ]
}
```

Selain kebijakan contoh sebelumnya, yang menyediakan izin `AWSSupport-TroubleshootEKSNetwork` hanya untuk, Anda memerlukan kebijakan tambahan untuk eksekusi runbook turunan `AWSSupport-SetupK8sApiProxyForEKS` dan. `AWSSupport-CollectEKSLinuxNodeStatistics` Kebijakan contoh berikut berlaku untuk dokumen-dokumen ini:

Izin diperlukan untuk`AWSSupport-SetupK8sApiProxyForEKS`:

```
{
    "Version":"2012-10-17",                   
    "Statement": [
        {
            "Action": [
                "tag:GetResources",
                "tag:TagResources",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:DeleteNetworkInterface",
                "eks:DescribeCluster",
                "iam:GetRole",
                "cloudformation:DescribeStacks",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "lambda:GetFunction",
                "lambda:ListTags",
                "logs:ListTagsForResource"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "AllowActionsWithoutConditions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": "iam:CreateRole",
            "Resource": [
                "arn:aws:iam::{{ACCOUNTID}}:role/Automation-K8sProxy*"
            ],
            "Effect": "Allow",
            "Sid": "AllowCreateRoleWithRequiredTag"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "iam:DeleteRole",
                "iam:TagRole",
                "iam:UntagRole"
            ],
            "Resource": [
                "arn:aws:iam::{{ACCOUNTID}}:role/Automation-K8sProxy*"
            ],
            "Effect": "Allow",
            "Sid": "IAMActions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                },
                "StringLike": {
                    "iam:PolicyARN": [
                        "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
                        "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
                    ]
                }
            },
            "Action": [
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy"
            ],
            "Resource": [
                "arn:aws:iam::{{ACCOUNTID}}:role/Automation-K8sProxy*"
            ],
            "Effect": "Allow",
            "Sid": "AttachRolePolicy"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:TagResource",
                "lambda:UntagResource",
                "lambda:UpdateFunctionCode"
            ],
            "Resource": "arn:aws:lambda:{{REGION}}:{{ACCOUNTID}}:function:Automation-K8sProxy*",
            "Effect": "Allow",
            "Sid": "LambdaActions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "cloudformation:UpdateStack"
            ],
            "Resource": "arn:aws:cloudformation:{{REGION}}:{{ACCOUNTID}}:stack/AWSSupport-SetupK8sApiProxyForEKS*",
            "Effect": "Allow",
            "Sid": "CloudFormationActions"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                }
            },
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutRetentionPolicy",
                "logs:TagResource",
                "logs:UntagResource"
            ],
            "Resource": [
                "arn:aws:logs:{{REGION}}:{{ACCOUNTID}}:log-group:/aws/lambda/Automation-K8sProxy*",
                "arn:aws:logs:{{REGION}}:{{ACCOUNTID}}:log-group:/aws/lambda/Automation-K8sProxy*:*"
            ],
            "Effect": "Allow",
            "Sid": "LogsActions"
        },
        {
            "Condition": {
                "StringLikeIfExists": {
                    "iam:PassedToService": "lambda.amazonaws.com"
                }
            },
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::{{ACCOUNTID}}:role/Automation-K8sProxy-Role*"
            ],
            "Effect": "Allow",
            "Sid": "PassRoleToLambda"
        }
    ]
}
```

Izin diperlukan untuk`AWSSupport-CollectEKSLinuxNodeStatistics`:

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetAccountPublicAccessBlock"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketPublicAccessBlock",
                "s3:GetBucketAcl",
                "s3:GetBucketPolicyStatus",
                "s3:GetBucketLocation",
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": "arn:aws:s3:::{{S3_BUCKET_NAME}}"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::{{S3_BUCKET_NAME}}/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeInstanceInformation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:SendCommand"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:document/AWS-RunShellScript",
                "arn:aws:ec2:*:{{ACCOUNTID}}:instance/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetCommandInvocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        }
    ]
}
```

## Petunjuk
<a name="automation-awssupport-troubleshooteksnetwork-instructions"></a>

1. Buka [`AWSSupport-TroubleshootEKSNetwork`](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-TroubleshootEKSNetwork/description) di Manajer Sistem di bawah Dokumen.

1. Pilih **Eksekusi otomatisasi**.

1. Untuk parameter input, masukkan yang berikut ini:
   + **AutomationAssumeRole (Opsional): **

     ARN dari peran IAM yang memungkinkan Otomasi Manajer Sistem untuk melakukan tindakan atas nama Anda. Jika tidak ada peran yang ditentukan, Sistem Manajer Otomasi menggunakan izin Anda untuk menjalankan runbook ini.
   + **S3BucketName (Diperlukan): **

     Nama bucket Amazon S3 untuk mengunggah aset pemecahan masalah.
   + **SourceClusterName (Diperlukan): **

     Nama sumber cluster Amazon EKS untuk memecahkan masalah.
   + **SourcePodName (Diperlukan): **

     Nama Kubernetes pod sumber yang memulai koneksi jaringan.
   + **SourcePodNamespace (Diperlukan): **

     Namespace tempat Kubernetes pod sumber berada.
   + **DestinationType (Diperlukan): **

     Jenis tujuan koneksi jaringan. Nilai yang valid:`POD`,`SERVICE`,`IP`, atau`DNS`.
   + **ConnectionProtocol (Diperlukan): **

     Protokol untuk koneksi jaringan. Nilai yang valid:`tcp`,`udp`, atau`sctp`.
   + **DestinationPort (Diperlukan): **

     Port tujuan koneksi jaringan.
   + **DestinationClusterName (Opsional): **

     Nama cluster Amazon EKS tujuan (diperlukan untuk tipe tujuan POD dan SERVICE).
   + **DestinationPodName (Opsional): **

     Nama Kubernetes pod tujuan (diperlukan untuk tipe tujuan POD).
   + **DestinationPodNamespace (Opsional): **

     Namespace tempat Kubernetes pod tujuan berada (diperlukan untuk tipe tujuan POD).
   + **DestinationServiceName (Opsional): **

     Nama Kubernetes layanan tujuan (diperlukan untuk jenis tujuan LAYANAN).
   + **DestinationServiceNamespace (Opsional): **

     Namespace tempat Kubernetes layanan tujuan berada (diperlukan untuk jenis tujuan LAYANAN).
   + **DestinationIpAddress (Opsional): **

     Alamat IPv4 atau IPv6 tujuan (diperlukan untuk jenis tujuan IP).
   + **DestinationDnsName (Opsional): **

     Nama DNS tujuan (diperlukan untuk tipe tujuan DNS).

1. Pilih **Eksekusi**.

1. Otomatisasi dimulai. Pantau status eksekusi pada tab ** Ek ** sekusi.

1. Dokumen melakukan langkah-langkah berikut secara otomatis:
   + **`ValidateTroubleshootingParameters`**:

     Memverifikasi parameter input yang diperlukan untuk pemecahan masalah, seperti apakah cluster ada.
   + **`SetupAuthProxyForSourceEKSCluster`**:

     Menjalankan `AWSSupport-SetupK8sApiProxyForEKS` dokumen untuk menyiapkan fungsi Lambda untuk membuat panggilan API Amazon EKS pada cluster Amazon EKS sumber.
   + **`BranchOnDestinationProxySetupRequired`**:

     Menentukan apakah akan `SetupK8sApiProxyForEKS` dijalankan untuk kluster tujuan berdasarkan jenis tujuan.
   + **`SetupAuthProxyForDestinationEKSCluster`**:

     Jika diperlukan, jalankan `AWSSupport-SetupK8sApiProxyForEKS` dokumen untuk mengatur fungsi Lambda untuk cluster Amazon EKS tujuan.
   + **`CollectSourcePodData`**:

     Mengumpulkan dan memvalidasi informasi pod sumber.
   + **`BranchOnSourcePodComputeEngine`**:

     Cabang tentang apakah Kubernetes pod sumber berjalan di Amazon EC2 untuk mengumpulkan statistik Linux untuk node.
   + **`CollectSourceLinuxNodeStatistics`**:

     Jika pod sumber berjalan di Amazon EC2, jalankan `AWSSupport-CollectEKSLinuxNodeStatistics` dokumen untuk mengambil statistik Linux dari node Kubernetes pod sumber.
   + **`CollectDestinationData`**:

     Mengumpulkan dan memvalidasi informasi tujuan.
   + **`BranchOnDestinationResults`**:

     Cabang tentang apakah Kubernetes pod tujuan berjalan di Amazon EC2 untuk mengumpulkan statistik Linux untuk node.
   + **`CollectDestinationLinuxNodeStatistics`**:

     Jika pod tujuan berjalan di Amazon EC2, jalankan `AWSSupport-CollectEKSLinuxNodeStatistics` dokumen untuk mengambil statistik Linux dari simpul Amazon EKS tujuan.
   + **`CleanupAuthProxyForSourceEKSCluster`**:

     Menjalankan `AWSSupport-SetupK8sApiProxyForEKS` dokumen menggunakan operasi Cleanup untuk membersihkan sumber daya yang dibuat untuk cluster sumber.
   + **`CleanupAuthProxyForDestinationEKSCluster`**:

     Jika berlaku, jalankan `AWSSupport-SetupK8sApiProxyForEKS` dokumen menggunakan operasi Pembersihan untuk membersihkan sumber daya yang dibuat untuk kluster tujuan.
   + **`GenerateReport`**:

     Menghasilkan laporan untuk alur pemecahan masalah.

1. Setelah otomatisasi selesai, tinjau bagian Output untuk hasil eksekusi.

## Referensi
<a name="automation-awssupport-troubleshooteksnetwork-references"></a>

Otomatisasi Systems Manager
+ Untuk informasi selengkapnya, lihat [ Menjalankan otomatisasi](https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-working-executing.html).
+ Untuk informasi selengkapnya, lihat [ Mengatur Otomatisasi](https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-setup.html).
+ Untuk informasi selengkapnya, lihat Men [ dukung Alur Kerja Otomasi. ](https://aws.amazon.com/premiumsupport/technology/saw/)