

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為您的 AWS SAM 應用程式設定程式碼簽署
<a name="authoring-codesigning"></a>

為了確保只部署受信任的程式碼，您可以使用 AWS SAM 啟用無伺服器應用程式的程式碼簽署。簽署您的程式碼有助於確保程式碼在簽署後沒有遭到更改，而且只有來自信任發佈者的簽署程式碼套件才會在您的 Lambda 函數中執行。這有助於讓組織免於在其部署管道中建置 gatekeeper 元件的負擔。

如需程式碼簽署的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[設定 Lambda 函數的程式碼簽署](https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html)。

您必須先使用 Signer 建立簽署設定檔，才能為無伺服器應用程式設定程式碼 AWS 簽署。您可以針對下列任務使用此簽署描述檔：

1. **建立程式碼簽署組態** – 宣告 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html) 資源以指定信任發佈者的簽署設定檔，並設定驗證檢查的政策動作。您可以在與無伺服器函數相同的 AWS SAM 範本、不同 AWS SAM 範本或 CloudFormation 範本中宣告此物件。然後，您可以使用 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html) 資源的 Amazon Resource Name (ARN) 指定函數的 [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-codesigningconfigarn](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-codesigningconfigarn) 屬性，為無伺服器函數啟用程式碼簽署。

1. **簽署您的程式碼** – 使用 [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-package.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-package.html)或 [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)命令搭配 `--signing-profiles`選項。

**注意**  
若要使用 `sam package`或 `sam deploy`命令成功簽署程式碼，您必須為搭配這些命令使用的 Amazon S3 儲存貯體啟用版本控制。如果您使用的是為您 AWS SAM 建立的 Amazon S3 儲存貯體，則會自動啟用版本控制。如需 Amazon S3 儲存貯體版本控制的詳細資訊，以及在您提供的 Amazon S3 儲存貯體上啟用版本控制的指示，請參閱《Amazon *Simple Storage Service 使用者指南*》中的[在 Amazon S3 儲存貯體中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。

當您部署無伺服器應用程式時，Lambda 會對您已啟用程式碼簽署的所有函數執行驗證檢查。Lambda 也會對這些函數依賴的任何層執行驗證檢查。如需 Lambda 驗證檢查的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[簽章驗證](https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html#config-codesigning-valid)。

## 範例
<a name="authoring-codesigning-example"></a>

### 建立簽署設定檔
<a name="authoring-codesigning-example-signing-profile"></a>

若要建立簽署設定檔，請執行下列命令：

```
aws signer put-signing-profile --platform-id "AWSLambda-SHA384-ECDSA" --profile-name MySigningProfile
```

如果上一個命令成功，您會看到簽署設定檔的 ARN 傳回。例如：

```
{
    "arn": "arn:aws:signer:us-east-1:111122223333:/signing-profiles/MySigningProfile",
    "profileVersion": "SAMPLEverx",
    "profileVersionArn": "arn:aws:signer:us-east-1:111122223333:/signing-profiles/MySigningProfile/SAMPLEverx"
}
```

`profileVersionArn` 欄位包含當您建立程式碼簽署組態時要使用的 ARN。

### 建立程式碼簽署組態並啟用函數的程式碼簽署
<a name="authoring-codesigning-example-configure-trusted-deployments"></a>

下列範例 AWS SAM 範本會宣告 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html) 資源，並啟用 Lambda 函數的程式碼簽署。在此範例中，有一個信任的設定檔，而且如果簽章檢查失敗，部署會遭到拒絕。

```
Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.7
      CodeSigningConfigArn: !Ref MySignedFunctionCodeSigningConfig

  MySignedFunctionCodeSigningConfig:
    Type: AWS::Lambda::CodeSigningConfig
    Properties:
      Description: "Code Signing for MySignedLambdaFunction"
      AllowedPublishers:
        SigningProfileVersionArns:
          - MySigningProfile-profileVersionArn
      CodeSigningPolicies:
        UntrustedArtifactOnDeployment: "Enforce"
```

### 簽署您的程式碼
<a name="authoring-codesigning-example-signing-code"></a>

您可以在封裝或部署應用程式時簽署程式碼。使用 `sam package`或 `sam deploy`命令指定 `--signing-profiles`選項，如下列範例命令所示。

在封裝應用程式時簽署函數程式碼：

```
sam package --signing-profiles HelloWorld=MySigningProfile --s3-bucket amzn-s3-demo-bucket --output-template-file packaged.yaml
```

在封裝應用程式時，同時簽署函數程式碼和函數依賴的圖層：

```
sam package --signing-profiles HelloWorld=MySigningProfile MyLayer=MySigningProfile --s3-bucket amzn-s3-demo-bucket --output-template-file packaged.yaml
```

簽署函數程式碼和 layer，然後執行部署：

```
sam deploy --signing-profiles HelloWorld=MySigningProfile MyLayer=MySigningProfile --s3-bucket amzn-s3-demo-bucket --template-file packaged.yaml --stack-name --region us-east-1 --capabilities CAPABILITY_IAM
```

**注意**  
為了使用 `sam package`或 `sam deploy`命令成功簽署程式碼，您必須為搭配這些命令使用的 Amazon S3 儲存貯體啟用版本控制。如果您使用的是為您 AWS SAM 建立的 Amazon S3 儲存貯體，則會自動啟用版本控制。如需 Amazon S3 儲存貯體版本控制的詳細資訊，以及在您提供的 Amazon S3 儲存貯體上啟用版本控制的指示，請參閱《Amazon *Simple Storage Service 使用者指南*》中的[在 Amazon S3 儲存貯體中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。

## 使用 提供簽署設定檔 `sam deploy --guided`
<a name="authoring-codesigning-sam-deploy-guided"></a>

當您使用以程式碼簽署設定的無伺服器應用程式執行 `sam deploy --guided`命令時， 會 AWS SAM 提示您提供用於程式碼簽署的簽署設定檔。如需`sam deploy --guided`提示的詳細資訊，請參閱 命令參考[sam deploy](sam-cli-command-reference-sam-deploy.md)中的 AWS SAM CLI 。