반응형

AWS 지역 선택


AWS Regions를 사용하면 특정 지역에 실제로 있는 AWS 서비스에 액세스할 수 있다. 이는 중복성을 유지하고 사용자 및 사용자가 액세스할 수 있는 곳에서 데이터 및 응용 프로그램을 계속 실행하는 데 유용할 수 있습니다. RegionEndpoint 클래스를 사용하여 AWS 서비스 클라이언트를 만들 때 영역을 지정할 수 있다.


다음은 특정 지역에서 Amazon EC2 클라이언트를 인스턴스화하는 예제다.


AmazonEC2Client ec2Client = new AmazonEC2Client(RegionEndpoint.USEast1);


지역은 서로 격리되어 있습니다. 예를 들어, EU(아일랜드)지역을 사용할 때는 미국 동부(버지니아)자원에 액세스할 수 없다. 코드에 여러 AWS Regions에 대한 액세스가 필요한 경우 각 지역마다 별도의 클라이언트를 만드는 것이 좋다.


중국(베이징)지역에서 서비스를 사용하려면 중국(베이징)지역에만 해당되는 계정과 자격 증명이 있어야 한다. 중국(베이징)지역에서는 다른 AWS 지역의 계정 및 자격 증명이 작동하지 않는다. 마찬가지로 중국(베이징)지역의 계정 및 자격 증명은 다른 AWS 지역에서는 작동하지 않는다. 중국(베이징)지역에서 사용할 수 있는 EndPoint 및 프로토콜에 대한 자세한 내용은 중국(베이징)지역을 참조하면 된다.


새 AWS 서비스는 초기에 몇 지역에서 시작한 다음 다른 지역에서 지원할 수 있다. 이 경우 새 region에 액세스하기 위해 최신 SDK를 설치할 필요가 없다. 새로 추가된 영역은 클라이언트별로 또는 전역으로 지정할 수 있다.



클라이언트 단위로 지역 선택하기(Per-Client)


GetBySystemName을 사용하여 새 지역 EndPoint를 만든다.


var newRegion = RegionEndpoint.GetBySystemName("us-west-new");
using (var ec2Client = new AmazonEC2Client(newRegion))
{
  // Make a request to EC2 using ec2Client
}


서비스 클라이언트 구성 클래스의 ServiceURL 등록 정보를 사용하여 영역을 지정할 수도 있다. 이 기술은 지역 EndPoint가 일반 지역 EndPoint 패턴을 따르지 않는 경우에도 작동한다.


var ec2ClientConfig = new AmazonEC2Config
{
    // Specify the endpoint explicitly
    ServiceURL = "https://ec2.us-west-new.amazonaws.com"
};

using (var ec2Client = new AmazonEC2Client(newRegion))
{
  // Make a request to EC2 using ec2Client
}



전역으로 지역 선택하기(Globally)


세 가지 방법을 통해서 지역을 전역으로 설정할 수 있다.

AWSConfigs.AWSRegion 속성을 설정할 수 있다.


AWSConfigs.AWSRegion = "us-west-new";
using (var ec2Client = new AmazonEC2Client())
{
  // Make request to Amazon EC2 using ec2Client
}


app.config 파일의 appSettings 섹션에서 AWSRegion 키를 설정할 수 있다.


<configuration>
  <appSettings>
    <add key="AWSRegion" value="us-west-2"/>
  </appSettings>
</configuration>


AWSRegion에 설명된대로 aws 섹션에서 region 속성을 설정할 수 있다.


<aws region="us-west-2"/>


각 AWS 서비스에 대해 지원되는 모든 지역과 EndPoint의 현재 목록을 보려면 Amazon Web Services General Reference의 Regions and Endpoints를 참조하면 된다.

반응형
반응형

AWS 자격 증명 구성하기(Configuring AWS Credentials)


AWS 자격 증명을 안전하게 관리하고 실수로 자격 증명을 공개할 수 있는 습관을 피해야 한다. 이 항목에서는 응용 프로그램의 AWS 자격 증명을 구성하여 보안을 유지하는 방법을 설명한다.

  • 계정의 루트 자격 증명을 사용하여 AWS 리소스에 액세스하면 안된다. 이러한 자격 증명은 제한없는 계정 액세스를 제공하며 취소하기 어렵다.
  • 프로젝트의 App.config 또는 Web.config 파일을 포함하여 응용 프로그램에 리터럴 액세스 키를 넣으면 안된다. 그렇게할 경우, 예를 들어 프로젝트를 공개 저장소에 업로드하는 할 때 실수로 자격 증명이 노출될 위험이 있다.

참고

AWS 계정을 만들고 자격 증명에 액세스 할 수 있다고 가정한다. 아직 로그인하지 않은 경우 AWS 계정 및 자격 증명 만들기[번역링크]를 참조하면 된다.


자격 증명을 안전하게 관리하기 위한 일반적인 지침은 다음과 같다.

  • AWS 루트 사용자 대신 IAM 사용자를 만들고 IAM 사용자 자격 증명을 사용해야 한다. IAM 사용자 자격 증명이 손상되면 쉽게 해지할 수 있다. 사용자를 특정 리소스 및 작업 집합으로 제한하는 정책을 각 IAM 사용자에게 적용할 수 있다.
  • 응용 프로그램 개발 중에 자격 증명을 관리하는 기본 방법은 SDK 저장소에 각 IAM 사용자 자격 증명 집합에 대한 프로필을 저장하는 것이다. 일반 텍스트 자격 증명 파일을 사용하여 자격 증명이 포함 된 프로필을 저장할 수도 있다. 그런 다음 프로젝트 파일에 자격 증명을 저장하는 대신 프로그래밍 방식으로 특정 프로필을 참조할 수 있다. 의도하지 않게 자격 증명이 노출 될 위험을 줄이려면 SDK 저장소 또는 자격 증명 파일을 프로젝트 파일과 별도로 저장해야 한다.
  • Amazon EC2 컨테이너 서비스(Amazon ECS) 태스크에 대한 IAM 역할을 태스크에 사용한다.
  • Amazon EC2 인스턴스에서 실행중인 응용 프로그램에 IAM 역할을 사용한다.
  • 조직 외부의 사용자가 사용할 수있는 응용 프로그램에 임시 자격 증명 또는 환경 변수를 사용한다.

다음 항목에서는 .NET용 AWS SDK 응용 프로그램의 자격 증명을 관리하는 방법에 대해 설명한다. AWS 자격 증명을 안전하게 관리하는 방법에 대한 설명은 AWS 액세스 키 관리 모범 사례를 참조하면 된다.



SDK 저장소 사용하기(Using SDK Store)


.NET 응용 프로그램용 AWS SDK 개발 중에 응용 프로그램에 사용할 각 자격 증명 집합에 대한 SDK 저장소에 프로파일을 추가해야 한다. 이렇게하면 실수로 AWS 자격 증명이 노출되는 것을 방지할 수 있다. SDK 저장소는 RegisteredAccounts.json 파일의 C:\Users\<사용자 이름>\AppData\Local\AWSToolkit 폴더에 있다. SDK 저장소는 다음과 같은 이점을 제공한다.

  • SDK 저장소는 여러 계정의 여러 프로필을 포함할 수 있다.
  • SDK 저장소의 자격 증명은 암호화되고 SDK 저장소는 사용자의 홈 디렉터리에 있다. 이로 인해 실수로 자격 증명이 노출될 위험이 제한된다.
  • 응용 프로그램에서 프로파일을 이름으로 참조하고 연관된 신임은 런타임에 참조된다. 원본 파일에 자격 증명이 절대 포함되지 않는다.
  • default라는 프로파일을 포함하면 .NET용 AWS SDK는 해당 프로파일을 사용한다. 다른 프로파일 이름을 제공하지 않거나 지정된 이름을 찾을 수 없는 경우에도 마찬가지이다.
  • 또한 SDK Store는 Windows PowerShell용 AWS Tools 및 Visual Studio용 AWS Toolkit에 대한 자격 증명을 제공한다.

참고

SDK 저장소 프로파일은 특정 호스트의 특정 사용자에게 한정된다. 다른 호스트 또는 다른 사용자에게 복사 할 수 없다. 이러한 이유로 프로덕션 응용 프로그램에서 SDK 저장소 프로필을 사용할 수 없다. 자세한 내용은 자격 증명 및 프로필 확인[번역은 아래 내용에 포함되어 있음]을 참조하면 된다.


여러 가지 방법으로 SDK 저장소의 프로필을 관리할 수 있다.

  • Visual Studio용 AWS Toolkit의 GUI(그래픽 사용자 인터페이스)를 사용하여 프로파일을 관리할 수 있다. GUI를 사용하여 SDK 저장소에 자격 증명을 추가하는 방법에 대한 자세한 내용은 Visual Studio용 AWS Toolkit에서 자격 증명 지정을 참조하면 된다.
  • Windows PowerShell용 AWS Tools에서 Set-AWSCredentials cmdlet을 사용하여 명령 줄(command line)에서 프로필을 관리할 수 있다. 자세한 내용은 AWS 자격 증명 사용을 참조하면 된다.
  • Amazon.Runtime.CredentialManagement.CredentialProfile 클래스를 사용하여 프로필을 프로그래밍 방식으로 만들고 관리 할 수 있다.

다음 예제에서는 RegisterProfile 메서드를 사용하여 기본 프로필과 SAML 프로필을 만들고 이를 SDK 저장소에 추가하는 방법을 보여준다.



프로필 만들기 및 .NET 자격 증명 파일에 저장하기


Amazon.Runtime.CredentialManagement.CredentialProfileOptions 객체를 만들고 AccessKey 및 SecretKey 속성을 설정한다. Amazon.Runtime.CredentialManagement.CredentialProfile 객체를 만든다. 작성한 프로파일의 이름과 CredentialProfileOptions 오브젝트를 제공해야 한다. 필요에 따라 프로필의 Region 속성을 설정하면 된다. NetSDKCredentialsFile 오브젝트를 인스턴스화하고 RegisterProfile 메소드를 호출하여 프로파일을 등록해야 한다.


var options = new CredentialProfileOptions
{
    AccessKey = "access_key",
    SecretKey = "secret_key"
};
var profile = new Amazon.Runtime.CredentialManagement.CredentialProfile("basic_profile", options);
profile.Region = RegionEndpoint.USWest1;
var netSDKFile = new NetSDKCredentialsFile();
netSDKFile.RegisterProfile(profile);


RegisterProfile 메서드는 새 프로필을 등록하는 데 사용된다. 일반적으로, 어플리케이션은 이 메소드를 각 프로파일에 대해서 1회만 호출한다.



SAMLEndpoint 및 연결된 프로필 만들기 및 .NET 자격 증명 파일에 저장하기


Amazon.Runtime.CredentialManagement.SAMLEndpoint 객체를 만든다. 이름 및 엔드 포인트 URI 매개 변수를 제공해야 한다. Amazon.Runtime.CredentialManagement.SAMLEndpointManager 객체를 만든다. RegisterEndpoint 메소드를 호출하여 엔드 포인트를 등록해야 한다. Amazon.Runtime.CredentialManagement.CredentialProfileOptions 객체를 만들고 EndpointName 및 RoleArn 속성을 설정한다. Amazon.Runtime.CredentialManagement.CredentialProfile 객체를 만들고 프로필 이름과 만든 CredentialProfileOptions 객체의 이름을 제공해야 한다. 필요에 따라 프로필의 Region 속성을 설정하면 된다. NetSDKCredentialsFile 오브젝트를 인스턴스화하고 RegisterProfile 메소드를 호출하여 프로파일을 등록해야 한다.


var endpoint = new SAMLEndpoint("endpoint1", new Uri("https://some_saml_endpoint"), SAMLAuthenticationType.Kerberos);
var endpointManager = new SAMLEndpointManager();
endpointManager.RegisterEndpoint(endpoint);
options = new CredentialProfileOptions
{
    EndpointName = "endpoint1",
    RoleArn = "arn:aws:iam::999999999999:role/some-role"
};
profile = new CredentialProfile("federated_profile", options);
netSDKFile = new NetSDKCredentialsFile();
netSDKFile.RegisterProfile(profile);



격 증명 파일 사용하기


프로파일을 공유 신임 정보 파일에 저장할 수도 있다. 이 파일은 다른 AWS SDK, AWS CLI 및 AWS Tools for Windows PowerShell에서 사용할 수 있다. 실수로 자격 증명을 노출 할 위험을 줄이려면 일반적으로 사용자의 홈 폴더에 프로젝트 파일과 별도로 자격 증명 파일을 저장해야 한다. 자격 증명 파일의 프로필은 일반 텍스트로 저장된다.


다음 두 가지 방법으로 공유 자격 증명 파일의 프로필을 관리할 수 있다.

  • 텍스트 편집기를 사용할 수 있다. 파일 이름이 자격 증명이며 기본 위치는 사용자의 홈 폴더 아래에 있다. 예를 들어 사용자 이름이 awsuser인 경우 자격 증명 파일은 C:\users\awsuser\.aws\credentials이 된다.
    다음은 신임 정보 파일에 있는 프로파일의 예시이다.

   [{profile_name}]
   aws_access_key_id = {accessKey}
   aws_secret_access_key = {secretKey}

 For more information, see
`Best Practices for Managing AWS Access Keys <http://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html>`_.


참고

default라는 프로파일을 포함하면 지정된 프로파일을 찾을 수없는 경우 .NET용 AWS SDK는 기본적으로 해당 프로파일을 사용한다.
선택한 위치(예 : C:\aws_service_credentials\credentials)에 프로필이 들어있는 자격 증명 파일을 저장할 수 있다. 그런 다음 프로젝트의 App.config 또는 Web.config 파일에서 AWSProfilesLocation 특성의 파일 경로를 명시적으로 지정한다. 자세한 내용은 프로필 지정[번역 내용은 아래쪽을 참조]을 참조하면 된다.



프로필 만들기 및 공유 자격 증명 파일에 저장


Amazon.Runtime.CredentialManagement.CredentialProfileOptions 객체를 만들고 AccessKey 및 SecretKey 속성을 설정한다. Amazon.Runtime.CredentialManagement.CredentialProfile 객체를 만든다. 작성한 프로파일의 이름과 CredentialProfileOptions를 제공해야 한다. 필요에 따라 프로필의 Region 속성을 설정하면 된다. Amazon.Runtime.CredentialManagement.SharedCredentialsFile 객체를 인스턴스화하고 RegisterProfile 메소드를 호출하여 프로파일을 등록해야 한다.


options = new CredentialProfileOptions
{
    AccessKey = "access_key",
    SecretKey = "secret_key"
};
profile = new CredentialProfile("shared_profile", options);
profile.Region = RegionEndpoint.USWest1;
var sharedFile = new SharedCredentialsFile();
sharedFile.RegisterProfile(profile);


RegisterProfile 메서드는 새 프로필을 등록하는 데 사용된다. 응용 프로그램에서는 일반적으로 이 메서드를 각 프로필에 대해 한 번만 호출한다.



원본 프로필 및 연결된 역할 프로필 만들기 및 자격 증명 파일에 저장(Create a Source Profile and an Associated Assume Role Profile and Save It to the Credentials File)


원본 프로파일에 대한 Amazon.Runtime.CredentialManagement.CredentialProfileOptions 객체를 만들고 AccessKey 및 SecretKey 속성을 설정한다. Amazon.Runtime.CredentialManagement.CredentialProfile 객체를 만든다. 작성한 프로파일의 이름과 CredentialProfileOptions를 제공해야 한다. Amazon.Runtime.CredentialManagement.SharedCredentialsFile 객체를 인스턴스화하고 RegisterProfile 메소드를 호출하여 프로파일을 등록해야 한다. 가정된 역할 프로필에 대해 또 다른 Amazon.Runtime.CredentialManagement.CredentialProfileOptions 객체를 만들고 프로필의 SourceProfile 및 RoleArn 속성을 설정한다. 가정된 역할에 대한 Amazon.Runtime.CredentialManagement.CredentialProfile 객체를 만든다. 작성한 프로파일의 이름과 CredentialProfileOptions를 제공해야 한다.


// Create the source profile and save it to the shared credentials file

// 원본 프로필을 만들어 공유 자격 증명 파일에 저장한다.
var sourceProfileOptions = new CredentialProfileOptions
{
    AccessKey = "access_key",
    SecretKey = "secret_key"
};
var sourceProfile = new CredentialProfile("source_profile", sourceProfileOptions);
sharedFile = new SharedCredentialsFile();
sharedFile.RegisterProfile(sourceProfile);

// Create the assume role profile and save it to the shared credentials file

// 가정 역할 프로필을 만들어 공유 자격 증명 파일에 저장한다.
var assumeRoleProfileOptions = new CredentialProfileOptions
{
    SourceProfile = "source_profile",
    RoleArn = "arn:aws:iam::999999999999:role/some-role"
};
var assumeRoleProfile = new CredentialProfile("assume_role_profile", assumeRoleProfileOptions);
sharedFile.RegisterProfile(assumeRoleProfile);



공유 자격 증명 파일에서 기존 프로필 업데이트


Amazon.Runtime.CredentialManagement.SharedCredentialsFile 객체를 만든다. 해당 프로파일에 대해 Region, AccessKey 및 SecretKey 속성을 설정한다. TryGetProfile 메서드를 호출해야 한다. 프로파일이 있으면 Amazon.Runtime.CredentialManagement.SharedCredentialsFile 인스턴스를 사용하고 RegisterProfile 메소드를 호출하여 업데이트된 프로파일을 등록하면 된다.


sharedFile = new SharedCredentialsFile();
CredentialProfile basicProfile;
if (sharedFile.TryGetProfile("basicProfile", out basicProfile))
{
    basicProfile.Region = RegionEndpoint.USEast1;
    basicProfile.Options.AccessKey = "different_access_key";
    basicProfile.Options.SecretKey = "different_secret_key";

    sharedFile.RegisterProfile(basicProfile);
}



응용 프로그램의 자격 증명 및 프로필 액세스


Amazon.Runtime.CredentialManagement.CredentialProfileStoreChain 클래스를 사용하여 .NET 자격 증명 파일이나 공유 자격 증명 파일에서 자격 증명 및 프로필을 쉽게 찾을 수 있다. 이것은 .NET SDK가 자격 증명 및 프로필을 찾는 방식이다. CredentialProfileStoreChain 클래스는 두 자격 증명 파일을 자동으로 체크인한다.


TryGetAWSCredentials 또는 TryGetProfile 메서드를 사용하여 자격 증명 또는 프로필을 가져올 수 있다. ProfilesLocation 속성은 다음과 같이 CredentialsProfileChain의 동작을 결정한다.

  1. ProfilesLocation이 null이 아니고 비어 있지 않으면 ProfilesLocation 등록 정보의 디스크 경로에서 공유 자격 증명 파일을 검색한다.
  2. ProfilesLocation이 null이거나 비어 있고 플랫폼이 .NET 자격 증명 파일을 지원하는 경우 .NET 자격 증명 파일을 검색한다. 프로필을 찾을 수 없는 경우 기본 위치에서 공유 자격 증명 파일을 검색한다.
  3. ProfilesLocation이 null이거나 비어 있고 플랫폼이 .NET 자격 증명 파일을 지원하지 않는 경우 기본 위치의 공유 자격 증명 파일을 검색한다.



기본 위치의 SDK 자격 증명 파일 또는 공유 자격 증명 파일에서 자격 증명을 가져오기


CredentialProfileStoreChain 객체와 Amazon.Runtime.AWSCredentials 객체를 만든다. TryGetAWSCredentials 메서드를 호출한다. 자격 증명을 반환할 프로필 이름과 AWSCredentials 개체를 제공한다.


var chain = new CredentialProfileStoreChain();
AWSCredentials awsCredentials;
if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials))
{
    // use awsCredentials
}




기본 위치의 SDK 자격 증명 파일 또는 공유 자격 증명 파일에서 프로필 가져오기


CredentialProfileStoreChain 객체와 Amazon.Runtime.CredentialManagement.CredentialProfile 객체를 만든다. TryGetProfile 메서드를 호출하고 자격 증명을 반환할 프로필 이름과 CredentialProfile 개체를 제공한다.


var chain = new CredentialProfileStoreChain();
CredentialProfile basicProfile;
if (chain.TryGetProfile("basic_profile", out basicProfile))
{
    // Use basicProfile
}



파일 위치에서 공유 자격 증명 파일 형식의 파일에서 AWSCredentials 가져오기


CredentialProfileStoreChain 객체를 만들고 자격 증명 파일의 경로를 제공한다. AWSCredentials 객체를 만든다. TryGetAWSCredentials 메서드를 호출한다. 자격 증명을 반환할 프로필 이름과 AWSCredentials 개체를 제공한다.


var chain = new CredentialProfileStoreChain("c:\\Users\\sdkuser\\customCredentialsFile.ini");
AWSCredentials awsCredentials;
if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials))
{
    // Use awsCredentials
}



SharedCredentialsFile 클래스를 사용하여 AmazonS3Client를 만드는 방법


Amazon.Runtime.CredentialManagement.SharedCredentialsFile 클래스를 사용하여 특정 프로필에 대한 자격 증명을 사용하는 AmazonS3Client 객체를 만들 수 있다. .NET용 AWS SDK는 프로필에 포함된 자격 증명을 자동으로 로드한다. App.Config에서 지정한 프로파일과 다른 특정 클라이언트에 대해 특정 프로파일을 사용하려는 경우 이 작업을 수행할 수 있다.


CredentialProfile basicProfile;
AWSCredentials awsCredentials;
var sharedFile = new SharedCredentialsFile();
if (sharedFile.TryGetProfile("basic_profile", out basicProfile) &&
    AWSCredentialsFactory.TryGetAWSCredentials(basicProfile, sharedFile, out awsCredentials))
{
    using (var client = new AmazonS3Client(awsCredentials, basicProfile.Region))
    {
        var response = client.ListBuckets();
    }
}


기본 프로파일을 사용하고 .NET용 AWS SDK에 자동으로 기본 자격 증명을 사용하여 클라이언트 객체를 만들려면 다음 코드를 사용하면 된다.


using (var client = new AmazonS3Client(RegionEndpoint.US-West2))
{
    var response = client.ListBuckets();
}



자격 증명 및 프로필 해결


.NET용 AWS SDK는 다음 순서로 자격 증명을 검색하고 현재 응용 프로그램에 대해 사용 가능한 첫 번째 set을 사용한다.

  1. 클라이언트 구성 또는 AWS 서비스 클라이언트에 명시 적으로 설정되는 항목.
  2. 사용 가능한 경우 AWSAccessKey 및 AWSSecretKey AppConfig 값에서 생성되는 BasicAWSCredentials.
  3. AWSConfigs.AWSProfileName (명시 적 또는 AppConfig에 설정)의 값으로 지정된 이름을 가진 자격 증명 프로파일.
  4. 기본 자격 증명 프로필.
  5. 모두 비어있는 경우 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 및 AWS_SESSION_TOKEN 환경 변수에서 생성된 SessionAWSCredentials.
  6. AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY 환경 변수에서 만들어지는 BasicAWSCredentials (둘 다 비어 있지 않은 경우)
  7. Amazon EC2 컨테이너 서비스 (Amazon ECS) 태스크에 대한 IAM 역할.
  8. EC2 인스턴스 메타 데이터.

SDK 저장소 프로파일은 특정 호스트의 특정 사용자에게 한정된다. 다른 호스트 또는 다른 사용자에게 복사할 수 없다. 이러한 이유로 다른 호스트 또는 개발자 컴퓨터에서 개발 컴퓨터에 있는 SDK 저장소 프로필을 다시 사용할 수 없다. 응용 프로그램이 Amazon EC2 인스턴스에서 실행중인 경우 .NET용 AWS SDK와 함께 EC2 인스턴스에 IAM 역할 사용에 설명된대로 IAM 역할을 사용해야 한다. 그렇지 않으면 웹 응용 프로그램이 서버에 액세스할 수있는 자격 증명 파일에 자격 증명을 저장한다.



프로필 해결(Profile Resolution)


두 가지 자격 증명 파일 유형을 사용하는 경우 .NET용 AWS SDK 및 Windows PowerShell용 AWS 도구를 사용하여 구성하는 방법을 이해하는 것이 중요하다. AWSConfigs.AWSProfilesLocation(명시적 또는 AppConfig에서 설정)은 .NET용 AWS SDK가 자격 증명 프로필을 찾는 방법을 제어한다. -ProfileLocation 명령 줄 인수(command line argument)는 Windows PowerShell용 AWS Tools에서 프로필을 찾는 방법을 제어한다. 두 경우 모두 구성이 작동하는 방식은 다음과 같다.


프로필 위치 값 

 프로필 해결 동작

 null (설정되지 않음) 또는 비어 있음

먼저 .NET 자격 증명 파일에서 지정된 이름의 프로필을 검색한다. 프로필이 없으면 %HOME%\.aws\credentials을 검색한다. 프로필이 없으면 %HOME%\.aws\config를 검색한다.

공유 자격 증명 파일 형식의 파일 경로

지정한 파일만 검색하여 지정된 이름의 프로필을 찾는다.



프로필 지정하기(Specifying a Profile)


프로필은 AWS SDK for .NET 응용 프로그램에서 자격 증명을 사용하는 기본 방법이다. 프로필이 저장되는 위치를 지정할 필요가 없다. 프로필은 이름으로 만 참조할 수 있다. .NET용 AWS SDK는 이전 섹션에서 설명한대로 해당 자격 증명을 검색한다.


프로필을 지정하는 가장 좋은 방법은 응용 프로그램의 App.config 또는 Web.config 파일의 appSettings 섹션에서 AWSProfileName 값을 정의하는 것이다. 연관된 자격 증명은 빌드 프로세스 중에 응용 프로그램에 통합된다.


다음 예제는 development라는 프로필을 지정한다.


<configuration>
  <appSettings>
    <add key="AWSProfileName" value="development"/>
  </appSettings>
</configuration>


이 예제에서는 프로필이 SDK 저장소 또는 기본 위치의 자격 증명 파일에 있다고 가정한다.


프로필이 다른 위치의 자격 증명 파일에 저장되어 있는 경우 <appSettings> 요소에 AWSProfilesLocation 속성 값을 추가하여 위치를 지정해야 한다. 다음 예에서는 C:\aws_service_credentials\credentials을 자격 증명 파일로 지정한다.


<configuration>
  <appSettings>
    <add key="AWSProfileName" value="development"/>
    <add key="AWSProfilesLocation" value="C:\aws_service_credentials\credentials"/>
  </appSettings>
</configuration>


프로필을 지정하는 더 이상 사용되지 않는 대체 방법은 아래에 완전성을 위해 표시되어 있지만 권장하지 않는다.


<configuration>
  <configSections>
    <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/>
  </configSections>
  <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/>
</configuration>

<configuration>
  <configSections>
    <section name="aws" type="Amazon.AWSSection,AWSSDK.Core"/>
  </configSections>
  <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/>
</configuration>



페더레이션 사용자 계정 자격 증명 사용


.NET용 AWS SDK (AWSSDK.Core 버전 3.1.6.0 이상)를 사용하는 응용 프로그램은 AD FS(Active Directory Federation Service)를 통한 페더레이션 사용자 계정을 사용하여 SAML(Security Assertion Markup Language)을 사용하여 AWS 웹 서비스에 액세스할 수 있다.


페더레이션된 액세스 지원은 사용자가 Active Directory를 사용하여 인증할 수 있음을 의미한다. 임시 자격 증명은 사용자에게 자동으로 부여된다. 1시간 동안 유효한 이러한 임시 자격 증명은 응용 프로그램이 AWS 웹 서비스를 호출할 때 사용된다. SDK는 임시 자격 증명 관리를 처리한다. 도메인에 가입된 사용자 계정의 경우 응용 프로그램에서 호출했지만 자격 증명이 만료된 경우 사용자가 자동으로 다시 인증되고 새 자격 증명이 부여된다. 도메인 가입이 아닌 계정의 경우 재인증 전에 자격 증명을 입력하라는 메시지가 사용자에게 표시된다.


.NET 응용 프로그램에서이 지원을 사용하려면 먼저 PowerShell cmdlet을 사용하여 역할 프로필을 설정해야 한다. 방법을 배우려면 AWS Tools for Windows PowerShell 설명서를 참조하면 된다.


역할 프로필을 설정한 후에 다른 인증 프로파일과 마찬가지로 AWSProfileName 키를 사용하여 응용 프로그램의 app.config/web.config 파일에서 프로필을 참조하면 된다.


런타임에 로드되는 SDK 보안 토큰 서비스 어셈블리(AWSSDK.SecurityToken.dll)는 AWS 자격 증명을 얻기위한 SAML 지원을 제공한다. 이 어셈블리는 런타임에 응용 프로그램에서 사용할 수 있어야 한다.



역할 또는 임시 자격 증명 지정


Amazon EC2 인스턴스에서 실행되는 응용 프로그램의 경우 자격 증명을 관리하는 가장 안전한 방법은 .NET용 AWS SDK와 함께 EC2 인스턴스에 IAM 역할 사용에 설명된대로 IAM 역할을 사용하는 것이다.


조직 외부 사용자가 소프트웨어 실행 파일을 사용할 수 있는 응용 프로그램 시나리오의 경우 임시 보안 자격 증명을 사용하도록 소프트웨어를 설계하는 것이 좋다. AWS 리소스에 제한적으로 액세스 할 수 있을뿐 아니라 이러한 자격 증명은 지정된 기간 후에 만료되는 이점이 있다. 임시 보안 자격 증명에 대한 자세한 내용은 다음을 참조하면 된다.

두 번째 글의 제목은 모바일 응용 프로그램을 구체적으로 언급하지만 이 문서에는 조직 외부에 배포된 AWS 응용 프로그램에 대한 유용한 정보가 들어있다.



프록시 자격 증명 사용


소프트웨어가 프록시를 통해 AWS와 통신하는 경우 서비스의 AmazonS3Config 클래스에 있는 ProxyCredentials 등록 정보를 사용하여 프록시에 대한 자격 증명을 지정할 수 있다. 예를 들어 Amazon S3의 경우 다음과 유사한 코드를 사용할 수 있다. {my-username} 및 {my-password}는 NetworkCredential 객체에 지정된 프록시 사용자 이름 및 비밀번호이다.


AmazonS3Config config = new AmazonS3Config();
config.ProxyCredentials = new NetworkCredential("my-username", "my-password");


이전 버전의 SDK에서는 ProxyUsername 및 ProxyPassword를 사용했지만 이러한 속성은 더 이상 사용되지 않는다.

반응형
반응형
.NET Core에서 사용되는 .NET용 AWS SDK 구성


.NET Core의 가장 큰 변화 중 하나는 ConfigurationManager와 .NET Framework 및 ASP.NET 응용 프로그램과 함께 사용되는 표준 app.config 및 web.config 파일이 제거된 것이다. 기존의 .NET 응용 프로그램의 경우, AWS SDK for .NET은 이 구성 시스템을 사용하여 AWS 자격 증명 및 지역을 설정하므로 코드에서 이를 수행할 필요가 없다.


.NET 코어의 구성 시스템은 모든 위치에서 모든 유형의 입력 소스를 허용한다. 또한 구성 객체는 표준 .NET 응용 프로그램의 ConfigurationManager와 같은 전역적 단일 객체가 아니므로 .NET용 AWS SDK에는 이 객체의 설정을 읽을 수 있는 액세스 권한이 없다.


참고
.NET Core 구성 시스템에 대한 배경 지식은 .NET Core 문서의 구성(Configuration) 항목을 참조하면 된다.


.NET Core용 AWS SDK for .NET을 쉽게 사용할 수 있도록 AWSSDK.Extensions.NETCore.Setup NuGet 패키지를 사용할 수 있다. 많은 .NET Core 라이브러리와 마찬가지로 IConfiguration 인터페이스에 확장 메서드를 추가하여 AWS 구성을 완벽하게 유지한다.



AWSSDK.Extensions.NETCore.Setup 사용하기


Visual Studio에서 ASP.NET Core MVC 응용 프로그램을 만들면 Startup.cs의 생성자는 ConfigurationBuilder를 사용하고 구성 속성을 기본 제공 IConfiguration 개체로 설정하여 다양한 입력 소스를 읽음으로써 구성을 처리한다.


public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}


Configuration 객체를 사용하여 AWS 옵션을 얻으려면 먼저 AWSSDK.Extensions.NETCore.Setup NuGet 패키지를 추가해야 한다. 그런 다음 옵션을 구성 파일에 추가한다. ConfigurationBuilder에 추가된 파일 중 하나는 $"appsettings.{env.EnvironmentName}.json"이다(Notice one of the files added to the Builder is called $"appsettings.{env.EnvironmentName}.json"). 프로젝트 속성에서 디버그 탭을 보면 이 파일이 개발(Development)로 설정되어 있음을 알 수 있다. 로컬 테스트 중에는 읽기 전용인 appsettings.Development.json 파일에 구성을 넣을 수 있기 때문에 로컬 테스트에 유용하다. EnvironmentName이 Production으로 설정된 Amazon EC2 인스턴스를 배포하면 이 파일은 무시되고 .NET용 AWS SDK는 Amazon EC2 인스턴스 용으로 구성된 IAM 자격 증명 및 영역으로 다시 돌아간다.


아래의 구성은 AWS 설정을 제공하기 위해 프로젝트의 appsettings.Development.json 파일에 추가 할 수 있는 값의 예를 보여준다.


{
  "AWS": {
    "Profile": "local-test-profile",
    "Region": "us-west-2"
  }
}


코드에서 파일에 설정된 AWS 옵션에 액세스하려면 IConfiguration에 추가된 GetAWSOptions 확장 메소드를 호출하면 된다. 이러한 옵션에서 서비스 클라이언트를 생성하려면 CreateServiceClient를 호출하면 된다. 다음 예제 코드는 Amazon S3 서비스 클라이언트를 만드는 방법을 보여준다.


var options = Configuration.GetAWSOptions();
IAmazonS3 client = options.CreateServiceClient<IAmazonS3>();



appsettings 파일에 허용되는 값


다음 app 구성값은 appsettings.Development.json 파일에서 설정할 수 있다. 필드 이름은 아래 목록에 표시된 대소문자를 사용해야 한다. 이러한 설정에 대한 자세한 내용은 AWS.Runtime.ClientConfg 클래스를 참조하면 된다.

  • Region
  • Profile
  • ProfilesLocation
  • SignatureVersion
  • RegionEndpoint
  • UseHttp
  • ServiceURL
  • AuthenticationRegion
  • AuthenticationServiceName
  • MaxErrorRetry
  • LogResponse
  • BufferSize
  • ProgressUpdateInterval
  • ResignRetries
  • AllowAutoRedirect
  • LogMetrics
  • DisableLogging
  • UseDualstackEndpoint



ASP.NET Core 종속성 인젝션


AWSSDK.Extensions.NETCore.Setup NuGet 패키지는 ASP.NET 코어의 새로운 종속성 인젝션 시스템과도 통합된다. Startup의 ConfigureServices 메서드는 MVC 서비스가 추가되는 곳이다. 응용 프로그램이 Entity Framework를 사용하는 경우 이 인스턴스도 초기화된다.


public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
}


참고
.NET Core의 종속성 인젝션에 대한 배경은 .NET Core 문서 사이트에서 볼 수 있다.


AWSSDK.Extensions.NETCore.Setup NuGet 패키지는 AWS 서비스를 종속성 인젝션에 추가하는데 사용할 수 있는 새로운 확장 메서드를 IServiceCollection에 추가한다. 다음 코드는 Amazon S3 및 DynamoDB를 우리의 서비스 목록에 추가하기 위해 IConfiguration에서 읽어온 AWS 옵션을 추가하는 방법을 보여준다.


public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
    services.AddAWSService<IAmazonS3>();
    services.AddAWSService<IAmazonDynamoDB>();
}


이제 MVC 컨트롤러가 IAmazonS3 또는 IAmazonDynamoDB를 생성자의 매개 변수로 사용하면 종속성 인젝션 시스템이 해당 서비스를 전달한다.


public class HomeController : Controller
{
    IAmazonS3 S3Client { get; set; }

    public HomeController(IAmazonS3 s3Client)
    {
        this.S3Client = s3Client;
    }

    ...

}


반응형
반응형

코드 예제


다음 예제는 .NET용 AWS SDK를 사용하여 개별 AWS 서비스를 사용하는 방법을 보여준다.


추가 샘플은 GitHub에서 이용할 수 있다.


시작하기 전에 .NET용 AWS SDK 설정[번역링크]과 .NET용 AWS SDK 프로그래밍[번역링크]을 읽어볼 것을 추천한다.


주제


반응형
반응형

.NET용 AWS SDK 버전 3으로 코드 마이그레이션하기


이 항목에서는 .NET용 AWS SDK 버전 3의 변경 사항과 이 버전의 SDK로 코드를 마이그레이션하는 방법에 대해 설명한다.



.NET 버전용 AWS SDK 정보


2009년 11월에 처음 출시된 .NET용 AWS SDK는 .NET Framework 2.0용으로 설계되었다. 이 릴리스 이후 .NET은 .NET Framework 4.0 및 .NET Framework 4.5로 개선되었으며 새로운 대상 플랫폼인 WinRT 및 Windows Phone이 추가되었다.


.NET 버전 2의 AWS SDK는 .NET 플랫폼의 새로운 기능을 활용하고 WinRT 및 Windows Phone을 대상으로 업데이트되었다.


.NET 버전 3용 AWS SDK가 어셈블리가 모듈화되도록 업데이트되었다.



SDK를 위한 아키텍처 재설계


.NET용 AWS SDK의 전체 버전 3은 모듈형으로 재설계되었다. 각 서비스는 이제 하나의 전역 어셈블리가 아닌 자체 어셈블리로 구현된다. 더 이상 .NET 용 AWS SDK 전체를 응용 프로그램에 추가할 필요없다. 이제 응용 프로그램에서 사용하는 AWS 서비스에 대해서만 어셈블리를 추가 할 수 있다.



변경 사항 요약


다음 섹션에서는 .NET용 AWS SDK 버전 3의 변경 사항에 대해 설명한다.


AWSClientFactory 제거


Amazon.AWSClientFactory 클래스가 제거되었다. 이제 서비스 클라이언트를 만들려면 서비스 클라이언트의 생성자를 사용해야 한다. 예를 들어, AmazonEC2Client를 작성하려면 다음의 작업을 수행해야 한다.


var ec2Client = new Amazon.EC2.AmazonEC2Client();


Amazon.Runtime.AssumeRoleAWSCredentials 제거


Amazon.Runtime.AssumeRoleAWSCredentials 클래스는 코어 네임 스페이스에 있었지만 AWS Security Token Service에 대한 종속성이 있고 SDK에서 사용되지 않으므로 제거되었다. 이 클래스를 대신해서 Amazon.SecurityToken.AssumeRoleAWSCredentials 클래스를 사용해야 한다.


SetACL 메서드가 S3Link에서 제거


S3Link 클래스는 Amazon.DynamoDBv2 패키지의 일부이며 Amazon S3에서 DynamoDB 항목의 참조인 객체를 저장하는 데 사용된다. 이것은 유용한 기능이지만 DynamoDB용 Amazon.S3 패키지에 대한 컴파일 종속성을 생성하고 싶지 않았기 때문에 S3Link 클래스에서 노출된 Amazon.S3 메서드를 단순화하여 SetACL 메서드를 MakeS3ObjectPublic 메서드로 대체했다. 객체에 대한 액세스 제어 목록(Access Control List, ACL)을 보다 효과적으로 제어하려면 Amazon.S3 패키지를 직접 사용해야 한다.


사용되지 않는 결과 클래스 제거(Removal of Obsolete Result Classes)


.NET 용 AWS SDK의 대부분의 서비스에서 작업은 요청 ID 및 결과 객체와 같은 작업에 대한 메타 데이터가 포함된 응답 객체를 반환한다. 별도의 응답 및 결과 클래스를 갖는 것이 중복되어 개발자를 위한 추가 타이핑(extra typing)을 만들었다. .NET 용 AWS SDK 버전 2에서는 결과 클래스의 모든 정보를 응답 클래스에 넣었고 결과 클래스를 사용하지 못하도록 폐기했다. .NET 용 AWS SDK 버전 3에서는 SDK의 크기를 줄이기 위해 이러한 쓸모없는 결과 클래스를 제거했다.


AWS 구성 섹션 변경(AWS Config Section Changes)


App.config 또는 Web.config 파일을 통해 .NET 용 AWS SDK의 고급 구성을 수행할 수 있다. SDK 어셈블리 이름을 참조하는 다음과 같은 <aws> config 섹션을 통해 이 작업을 수행할 수 있다.


<configuration>
  <configSections>
    <section name="aws" type="Amazon.AWSSection, AWSSDK"/>
  </configSections>
  <aws region="us-west-2">
    <logging logTo="Log4Net"/>
  </aws>
</configuration>


.NET 용 AWS SDK 버전 3에서는 AWSSDK 어셈블리가 더 이상 존재하지 않고 공통 코드를 AWSSDK.Core 어셈블리에 넣었다. 따라서 다음과 같이 App.config 또는 Web.config 파일에서 AWSSDK 어셈블리에 대한 참조를 AWSSDK.Core 어셈블리로 변경해야 한다.


<configuration>
  <configSections>
    <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/>
  </configSections>
  <aws region="us-west-2">
    <logging logTo="Log4Net"/>
  </aws>
</configuration>


Amazon.AWSConfigs 클래스를 사용하여 구성 설정을 조작할 수도 있다. .NET용 AWS SDK 버전 3에서는 DynamoDB의 구성 설정을 Amazon.AWSConfigs 클래스에서 Amazon.AWSConfigsDynamoDB 클래스로 이동했다.

반응형
반응형

재시도 및 시간 초과(Retries and Timeouts)


.NET 용 AWS SDK를 사용하면 AWS 서비스에 대한 HTTP 요청에 대한 재시도 횟수 및 시간 초과 값을 구성 할 수 있다. 재시도 및 시간 초과 값의 기본값이 응용 프로그램에 적합하지 않은 경우 특정 요구 사항에 맞게 조정할 수는 있지만 이를 수행하는 것이 응용 프로그램의 동작에 어떻게 영향을 미치는지 이해하는 것이 중요하다.


재시도 및 시간 초과에 사용할 값을 결정하려면 다음을 고려해야 한다.

  • 네트워크 연결이 저하되거나 AWS 서비스에 도달할 수 없을 때 .NET 용 AWS SDK 및 응용 프로그램이 어떻게 응답해야 하는가? 호출에 실패했을 때, 연결을 포기해야 하는가? 아니면 계속 호출을 재시도하도록 할 것인가?
  • 응용 프로그램이 응답성이 있어야하는 사용자 지향 응용 프로그램 또는 웹 사이트인가? 대기 시간 증가에 대한 내성이 더 높은 백그라운드 처리 작업인가?
  • 응용 프로그램이 대기 시간이 낮은 안정적인 네트워크를 대상으로 배포되었는가? 아니면 신뢰할 수없는 연결로 원격 위치에 배포되었는가?



재시도


.NET 용 AWS SDK는 서버 측 조절 또는 연결 끊김으로 인해 실패한 요청을 다시 시도한다. ClientConfig 클래스의 MaxErrorRetry 속성을 사용하여 서비스 클라이언트 수준에서 재시도 횟수를 지정할 수 있다. .NET 용 AWS SDK는 실패하고 예외를 throw하기 전에 지정된 횟수만큼 작업을 재시도한다. 기본적으로 MaxErrorRetry 속성은 AmazonDynamoDBConfig 클래스를 제외하고는 4로 설정되며, 기본값은 10회이다. 재시도가 발생하면 요청 대기 시간이 길어진다. 총 요청 대기 시간 및 오류율에 대한 응용 프로그램 제한을 기반으로 재시도를 구성해야 한다.



시간 초과


.NET 용 AWS SDK를 사용하면 서비스 클라이언트 수준에서 요청 시간 초과 및 소켓 읽기/쓰기 시간 초과 값을 구성할 수 있다. 이 값은 ClientConfig 클래스의 Timeout 및 ReadWriteTimeout 속성에 각각 지정된다. 이 값은 AWS 서비스 클라이언트 객체에 의해 생성된 HttpWebRequest 객체의 Timeout 및 ReadWriteTimeout 속성으로 전달된다. 기본적으로 Timeout 값은 100초이고 ReadWriteTimeout 값은 300초이다. 네트워크의 대기 시간이 길거나 작업을 다시 시도 할 수 있는 조건이 있는 경우 긴 시간 제한 값과 많은 재시도 횟수를 사용하면 일부 SDK 작업이 응답하지 않을 수 있다.


참고

이식 가능한 클래스 라이브러리(Portable Class Library, PCL)를 대상으로하는 .NET 용 AWS SDK 버전은 HttpWebRequest 클래스 대신 HttpClient 클래스를 사용하며 Timeout 속성만 지원한다.


다음은 기본 시간 초과 값에 대한 예외이다. 이 값은 명시적으로 시간 종료 값을 설정할 때 대체된다.



예제


다음 예제에서는 AmazonS3Client 객체에 대해 최대 2번의 재시도, 10초의 시간 초과 및 10초의 읽기/쓰기 시간 초과를 지정하는 방법을 보여준다.


var client =  new AmazonS3Client(
  new AmazonS3Config
  {
    Timeout = TimeSpan.FromSeconds(10),                 // Default value is 100 seconds
    ReadWriteTimeout = TimeSpan.FromSeconds(10),   // Default value is 300 seconds
    MaxErrorRetry = 2                                           // Default value is 4 retries
  });


반응형
반응형

Amazon Web Services .NET 용 비동기 API


.NET Framework 4.5, Windows Store 및 Windows Phone 8 용 비동기 API


.NET 용 AWS SDK는 .NET Framework 버전 4.5, Windows Store 및 Windows Phone 8에 대한 새로운 작업 기반 비동기 패턴을 사용한다. async 및 await 키워드를 사용하면 차단하지 않고 모든 AWS 제품에 대한 비동기 작업을 수행하고 관리 할 수 있다. 작업 기반 비동기 패턴에 대한 자세한 내용은 MSDN의 작업 기반 비동기 패턴 (TAP)을 참조하면 된다.



.NET Framework 3.5 용 비동기 API


.NET 용 AWS SDK는 .NET 클라이언트 클래스에 의해 노출 된 대부분의 메소드 호출의 비동기(async)버전을 지원한다. 비동기 메소드를 사용하면 서비스의 응답에 코드 블록이 없어도 AWS 서비스를 호출 할 수 있다. 예를 들어 Amazon S3 또는 DynamoDB에 데이터를 쓰도록 요청한 다음 AWS가 요청을 처리하는 동안 코드가 다른 작업을 계속하도록 할 수 있다.


비동기 요청 메서드의 구문


AWS 서비스에 비동기 요청을 하는 데에는 두 가지 단계가 있다. 첫 번째는 요청에 대한 Begin 메서드를 호출하는 것이다. 이 메서드는 비동기 작업을 시작한다. 해당 End 메서드는 서비스에서 응답을 검색하고 작업 중에 발생할 수 있는 예외를 처리 할 수 있는 기회를 제공한다.

참고

End 메서드를 호출 할 필요는 없다. 오류가 없다고 가정하면 End를 호출했는지 여부에 관계없이 비동기 작업이 완료된다.


Begin 메서드 구문


PutItemRequest와 같은 리퀘스트 오브젝트 매개변수를 가져 오는 것 외에도 비동기 Begin 메서드는 두 가지 추가 매개변수인 콜백 함수와 상태 오브젝트를 사용한다. Begin 메서드는 서비스 리퀘스트 오브젝트를 반환하는 대신 IAsyncResult 형식의 결과를 반환합니다. 이 유형의 정의에 대해서는 MSDN 설명서를 참조하면 확인할 수 있다.


동기식 메서드

PutItemResponse PutItem( PutItemRequest putItemRequest )


비동기식 메서드

IAsyncResult BeginPutItem( GetSessionTokenRequest getSessionTokenRequest, {AsyncCallback callback}, {Object state} )


AsyncCallback 콜백

비동기 작업이 완료되면 콜백 함수가 호출된다. 함수가 호출되면 IAsyncResult 유형의 단일 매개 변수를 받는다. 콜백 함수는 다음의 시그니처를 가진다.

void Callback( IAsyncResult asyncResult )


오브젝트 상태(Object state)

세 번째 매개변수인 state는 asyncResult 매개변수의 AsyncState 속성, 즉 asyncResult.AsyncState로 콜백 함수에서 사용할 수있는 사용자 정의 오브젝트이다.


패턴 호출(Calling Patterns)

  • 콜백 함수와 상태 객체 전달.
  • 콜백 함수를 전달하지만 상태 객체에 null을 전달한다.
  • 콜백 함수와 상태 객체 모두에 대해 null을 전달한다.

이 주제는 이러한 각 패턴의 예를 제공한다.


IAsyncResult.AsyncWaitHandle 사용


경우에 따라 Begin 메서드를 호출하는 코드가 비동기 작업이 완료될 때까지 대기하도록 호출하는 다른 메서드를 사용해야 할 수도 있다. 이러한 상황에서는 WaitHandle이 IAsyncResult 반환 값의 IAsyncResult.AsyncWaitHandle 속성에서 반환한 메서드를 전달할 수 있다. 그런 다음 이 메서드는 이 WaitHandle에서 WaitOne을 호출하여 비동기 작업이 완료될 때까지 대기할 수 있다.


예제


뒤의 모든 예제는 모두 다음 초기화 코드를 통해서 초기화 되었다고 가정한다.

public static void TestPutObjectAsync()
{
  // Create a client AmazonS3Client

  // AmazonS3Client 클라이언트를 생성한다.
  client = new AmazonS3Client();

  PutObjectResponse response;
  IAsyncResult asyncResult;

  //
  // Create a PutObject request

  // PutObject 요청을 생성한다.
  //
  // You will need to use your own bucket name below in order
  // to run this sample code.

  // 이 샘플 코드를 실행하려면 아래에 자신의 버킷 이름을 사용해야 한다.
  //
  PutObjectRequest request = new PutObjectRequest
  {
    BucketName = "{PUT YOUR OWN EXISTING BUCKET NAME HERE : 당신이 가진 실제 버킷 이름을 여기에 넣어라}",
    Key = "Item",
    ContentBody = "This is sample content..."
  };

  //
  // additional example code

  // 추가 예제 코드
  //
}


지정된 콜백이 없는 경우(No Callback Specified)


다음 예제 코드에서는 BeginPutObject를 호출하고 작업을 수행한 다음 EndPutObject를 호출하여 서비스 응답을 검색한다. EndPutObject에 대한 호출은 try 블록에 포함되어 작업 중에 발생할 수 있는 예외를 잡는다.


asyncResult = client.BeginPutObject(request, null, null);


while ( ! asyncResult.IsCompleted )

{
  //
  // Do some work here

  // 작업을 여기서 처리한다.
  //
}


try

{
  response = client.EndPutObject(asyncResult);
}
catch (AmazonS3Exception s3Exception)

{
  //
  // Code to process exception

  // 예외 처리 코드
  //
}



간단한 콜백(Simple Callback)


이 예제에서는 다음 콜백 함수가 정의되어 있다고 가정한다.


public static void SimpleCallback(IAsyncResult asyncResult)
{
  Console.WriteLine("Finished PutObject operation with simple callback :
간단한 콜백으로 PutObject 작업 완료");
}


다음 코드는 BeginPutObject를 호출하고 위의 콜백 함수를 지정한다. PutObject 작업이 완료되면 콜백 함수가 호출된다. 단순 콜백 함수는 asyncResult 매개 변수의 AsyncState 속성에 액세스하지 않기 때문에 BeginPutObject를 호출하면 state 매개 변수에 null이 지정된다. 호출 코드나 콜백 함수는 EndPutObject를 호출하지 않는다. 따라서 서비스 응답이 효과적으로 삭제되고 작업 중에 발생하는 예외는 무시된다.


asyncResult = client.BeginPutObject(request, SimpleCallback, null);



클라이언트와의 콜백(Callback with Client)


이 예제에서는 다음 콜백 함수가 정의되어 있다고 가정한다.


public static void CallbackWithClient(IAsyncResult asyncResult)
{
  try

  {
    AmazonS3Client s3Client = (AmazonS3Client) asyncResult.AsyncState;
    PutObjectResponse response = s3Client.EndPutObject(asyncResult);
    Console.WriteLine("Finished PutObject operation with client callback :
클라이언트 콜백으로 PutObject 작업 완료");
  }
  catch (AmazonS3Exception s3Exception)

  {
    //
    // Code to process exception

    // 예외 처리 코드
    //
  }
}


다음 코드는 BeginPutObject를 호출하고 앞의 콜백 함수를 지정한다. PutObject 작업이 완료되면 콜백 함수가 호출된다. 이 예제에서 BeginPutObject를 호출하면 state 매개 변수에 대한 AmazonS3 클라이언트 객체가 지정된다. 콜백 함수는 클라이언트를 사용하여 EndPutObject 메소드를 호출하고 서버 응답을 검색한다. 콜백이 EndPutObject를 호출할 때 연산 중에 발생한 모든 예외가 수신되므로이 호출은 try 블록 내에 배치된다.


asyncResult = client.BeginPutObject(request, CallbackWithClient, client);



상태 오브젝트를 사용한 콜백(Callback with State Object)


이 예제에서는 다음 클래스와 콜백 함수가 정의되어 있다고 가정한다.


class ClientState
{
  AmazonS3Client client;
  DateTime startTime;

  public AmazonS3Client Client
  {
    get { return client; }
    set { client = value; }
  }

  public DateTime Start
  {
    get { return startTime; }
    set { startTime = value; }
  }
}


public static void CallbackWithState(IAsyncResult asyncResult)
{
  try

  {
    ClientState state = asyncResult.AsyncState as ClientState;
    AmazonS3Client s3Client = (AmazonS3Client)state.Client;
    PutObjectResponse response = state.Client.EndPutObject(asyncResult);
    Console.WriteLine("Finished PutObject. Elapsed time(
완료된 PutObject. 경과 시간) : {0}", (DateTime.Now - state.Start).ToString());
  }
  catch (AmazonS3Exception s3Exception)

  {
    //
    // Code to process exception

    // 예외 처리 코드
    //
  }
}


다음 코드는 BeginPutObject를 호출하고 위의 콜백 함수를 지정한다. PutObject 작업이 완료되면 콜백 함수가 호출된다. 이 예제에서 BeginPutObject에 대한 호출은 state 매개변수에 대해 이전에 정의된 ClientState 클래스의 인스턴스를 지정한다. 이 클래스는 AmazonS3 클라이언트와 BeginPutObject가 호출된 시간을 포함한다. 콜백 함수는 AmazonS3 클라이언트 객체를 사용하고 EndPutObject 메소드를 호출하여 서버 응답을 검색한다. 콜백은 작업의 시작 시간을 추출하여 비동기 작업이 완료되는 데 걸리는 시간을 출력하는 데 사용한다.


이전 예제와 마찬가지로 EndPutObject가 호출될 때 작업 중에 발생하는 예외가 수신되므로 이 호출은 try 블록 내에 배치된다.


asyncResult = client.BeginPutObject( request, CallbackWithState, new ClientState { Client = client, Start = DateTime.Now } );



완성된 샘플


다음 코드 샘플은 비동기 요청 메서드를 호출 할 때 사용할 수있는 패턴을 보여준다.


using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;

using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;

namespace async_aws_net
{
   class ClientState
   {
      AmazonS3Client client;
      DateTime startTime;

      public AmazonS3Client Client
      {
         get { return client; }
         set { client = value; }
      }

      public DateTime Start
      {
         get { return startTime; }
         set { startTime = value; }
      }
   }

   class Program
   {
      public static void Main(string[] args)
      {
         TestPutObjectAsync();
      }

      public static void SimpleCallback(IAsyncResult asyncResult)
      {
         Console.WriteLine("Finished PutObject operation with simple callback");
         Console.Write("\n\n");
      }

      public static void CallbackWithClient(IAsyncResult asyncResult)
      {
         try

         {
            AmazonS3Client s3Client = (AmazonS3Client) asyncResult.AsyncState;
            PutObjectResponse response = s3Client.EndPutObject(asyncResult);
            Console.WriteLine("Finished PutObject operation with client callback");
            Console.WriteLine("Service Response:");
            Console.WriteLine("-----------------");
            Console.WriteLine(response);
            Console.Write("\n\n");
         }
         catch (AmazonS3Exception s3Exception)

         {
            //
            // Code to process exception
            //
         }
      }

      public static void CallbackWithState(IAsyncResult asyncResult)
      {
         try

         {
            ClientState state = asyncResult.AsyncState as ClientState;
            AmazonS3Client s3Client = (AmazonS3Client)state.Client;
            PutObjectResponse response = state.Client.EndPutObject(asyncResult);
            Console.WriteLine("Finished PutObject operation with state callback that started at {0}",

                (DateTime.Now - state.Start).ToString() + state.Start);
            Console.WriteLine("Service Response:");
            Console.WriteLine("-----------------");
            Console.WriteLine(response);
            Console.Write("\n\n");
         }
         catch (AmazonS3Exception s3Exception)

         {
            //
            // Code to process exception
            //
         }
      }

      public static void TestPutObjectAsync()
      {
         // Create a client
         AmazonS3Client client = new AmazonS3Client();

         PutObjectResponse response;
         IAsyncResult asyncResult;

         //
         // Create a PutObject request
         //
         // You will need to change the BucketName below in order to run this
         // sample code.
         //
         PutObjectRequest request = new PutObjectRequest
         {
           BucketName = "PUT-YOUR-OWN-EXISTING-BUCKET-NAME-HERE",
           Key = "Item",
           ContentBody = "This is sample content..."
         };

         response = client.PutObject(request);
         Console.WriteLine("Finished PutObject operation for {0}.", request.Key);
         Console.WriteLine("Service Response:");
         Console.WriteLine("-----------------");
         Console.WriteLine("{0}", response);
         Console.Write("\n\n");

         request.Key = "Item1";
         asyncResult = client.BeginPutObject(request, null, null);
         while ( ! asyncResult.IsCompleted )

         {
           //
           // Do some work here
           //
         }
         try

         {
           response = client.EndPutObject(asyncResult);
         }
         catch (AmazonS3Exception s3Exception)

         {
           //
           // Code to process exception
           //
         }

         Console.WriteLine("Finished Async PutObject operation for {0}.", request.Key );
         Console.WriteLine("Service Response:");
         Console.WriteLine("-----------------");
         Console.WriteLine(response);
         Console.Write("\n\n");

         request.Key = "Item2";
         asyncResult = client.BeginPutObject(request, SimpleCallback, null);

         request.Key = "Item3";
         asyncResult = client.BeginPutObject(request, CallbackWithClient, client);

         request.Key = "Item4";
         asyncResult = client.BeginPutObject(request, CallbackWithState,
            new ClientState { Client = client, Start = DateTime.Now } );

         Thread.Sleep( TimeSpan.FromSeconds(5) );
      }
   }
}



참고사항


반응형
반응형
.NET 응용 프로그램용 AWS SDK 구성


Amazon S3 용 AWS SDK for .NET 애플리케이션을 구성하여 AWS 자격 증명, 로깅 옵션, 엔드 포인트 또는 서명 버전 4 지원을 지정할 수 있다.


응용 프로그램을 구성하는 데 권장되는 방법은 프로젝트의 App.config 또는 Web.config 파일에서 <aws> 요소를 사용하는 것이다. 다음 예제에서는 AWSRegionAWSLogging 매개 변수를 지정한다.


<configuration>
  <configSections>
    <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/>
  </configSections>
  <aws region="us-west-2">
    <logging logTo="Log4Net"/>
  </aws>
</configuration>


응용 프로그램을 구성하는 또 다른 방법은 프로젝트의 App.config 또는 Web.config 파일에서 <appSettings> 요소를 편집하는 것이다. 다음 예제에서는 AWSRegion AWSLogging 매개 변수를 지정한다.


<configuration>
  <appSettings>
    <add key="AWSRegion" value="us-west-2"/>
    <add key="AWSLogging" value="log4net"/>
  </appSettings>
</configuration>


이러한 설정은 응용 프로그램을 다시 작성한 후에 만 적용된다.


AWSConfigs 클래스에서 속성 값을 설정하여 프로그래밍 방식으로 .NET 용 AWS SDK 응용 프로그램을 구성 할 수 있지만 대신 aws 요소를 사용하는 것이 좋다. 다음 예제에서는 AWSRegion AWSLogging 매개 변수를 지정한다.


AWSConfigs.AWSRegion = "us-west-2";
AWSConfigs.Logging = LoggingOptions.Log4Net;


프로그래밍 방식으로 정의된 매개 변수는 App.config 또는 Web.config 파일에 지정된 값보다 우선시 한다. 프로그래밍 방식으로 정의된 일부 매개 변수 값은 즉시 적용된다. 다른 것은 새 클라이언트 오브젝트를 작성한 후에만 적용된다.


자세한 내용은 AWS 자격 증명 구성을 참조하면 된다.



주제


반응형

+ Recent posts