유니티에서 JSON 사용하기(Newtonsoft JSON)

작성 기준 버전 :: 2018.3.1f1

 

JSON은 웹이나 네트워크에서 서버와 클라이언트 사이에서 데이터를 주고 받을 때 사용하는 개방형 표준 포멧으로, 텍스트를 사용하기 때문에 사람이 이해하기 쉽다는 장점이 있다.

 

이런 JSON 포멧을 유니티에서도 많이 사용하는 편이다. 네트워크 게임을 개발할 때 게임에 필요한 데이터를 주고 받거나, 게임 진행 상황을 저장하거나, 게임 설정을 저장하는 방식으로도 사용할 수 있다.

 

유니티에서 XML을 사용하는 것과 사용 범위가 거의 일치하는데, XML은 가독성이 매우 떨어지고 데이터를 넣거나 꺼내기 위해 파싱(Parsing)하는 과정이 까다로운데 반해서, JSON은 XML에 비해서 가독성이 좋고 직렬화(Serialize)와 비직렬화(Deserialize) 함수를 통해서 데이터에서 JSON 데이터로, JSON 데이터에서 데이터로 편하게 변환할 수 있다는 장점을 가지고 있다.

 

Newtonsoft의 JSON 라이브러리는 다양한 전체 기능을 제공하는 라이브러리로 시리얼라이즈 및 디시리얼라이즈하는 컴팩트한 기능만을 사용하기를 원한다면 유니티 엔진에 내장된 JsonUtility를 사용할 것을 권장한다.

 

 

JSON 라이브러리 다운로드 및 프로젝트에 임포트(Download JSON & Import JSON to project)

 

우선 JSON 라이브러리를 다운로드받기 위해 아래 링크에 접속한다.

 

Newtonsoft JSON Library

 

그리고 릴리즈된 애셋 중에 원하는 버전의 Json(버전).zip 파일을 다운로드받는다.

 

 

다운로드 받은 파일을 압축을 해제하고 폴더를 열어보면 위와 같은 폴더와 파일들이 보일텐데 그 중에서 Bin 폴더를 연다.

 

 

 

Bin 폴더 안에는 사용하는 .NET 버전에 따라 라이브러리 파일들이 폴더에 나눠져 담겨있는데, 일반적으로는 net35 폴더 안에 있는 dll을 사용하면 되지만, 유니티에서 .NET 4.x 기능을 사용하거나 최신 버전의 기능이 필요하다면 net45 폴더 안에 있는 dll을 사용해도 된다. 이번 섹션에서는 간단하게 JSON 사용법을 익힐 것이기 때문에 net35 버전을 사용한다.

 

 

net35 폴더 안에서 Newtonsoft.Json.dll 파일을 프로젝트 창에 드래그해서 프로젝트에 포함시킨다.

 

 

JSON의 기본구조

 

기본적인 JSON 데이터의 구조는 다음과 같다.

 

{

    "id":"wergia",

    "level":10,

    "exp":33.3,

    "hp":400,

    "items":

    [

        "Sword",

        "Armor",

        "Hp Potion",

        "Hp Potion",

        "Hp Potion"

    ]

}

 

JSON의 데이터는 키(Key)와 값(Value) 쌍(Pair)로 이루어진 데이터를 저장하는데, items와 같이 배열로 된 데이터 역시 저장이 가능하고 객체 안에 객체를 넣는 것도 가능하며 위의 데이터 내용이 문자열로 이루어져 있기 때문에 사람이 알아보기가 매우 쉽다.

 

JSON 데이터에서 { } 는 객체를 의미하고, [ ] 는 순서가 있는 배열을 나타낸다. 그리고 JSON은 정수, 실수, 문자열, 불리언, null 타입의 데이터 타입을 지원한다.

 

JSON은 주석을 지원하지 않기 때문에, JSON 파일을 사람이 읽고 수정할 수 있도록 할 예정이라면, 키의 이름을 명확하게 정해서 이 값이 무엇을 의미하는지 확실히 표현하는게 좋다.

 

 

JSON의 단점은 작은 문법 오류에도 매우 민감하다는 점이다. 중간에 중괄호나 대괄호, 콜론, 쉼표가 하나라도 빠지면 JSON 파일이 깨져버리고 파일을 읽어들일 수 없게 된다. 이런 문제 때문에 구글에서 JSON 검사기를 검색하면 JSON 데이터가 유효한지 검사해주는 웹페이지들이 많다. JSON 데이터를 작성하고 난 뒤에는 JSON 데이터 파일의 깨짐으로 인한 버그를 막기 위해서 이런 JSON 검사기로 검사하고 사용하는 것이 좋다.

 

 

 

 

 

유니티에서 JSON 사용하기

 

JSON에 대해서 간단하게 알아보았으니 이제 유니티에서 JSON을 사용하는 방법에 대해서 알아보자.

 

기본적인 JSON <-> Object 변환하기

 

우선 Json 예제를 작성할 JsonExample 클래스를 하나 생성한다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

 

public class JsonExample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
       
    }
}

 

JSON과 관련된 기능을 사용하기 위해서 상단의 using 지시문 파트에 다음 using 지시문을 추가한다.

 

using Newtonsoft.Json;

 

using 지시문을 추가하지 않아도 기능을 사용할 수는 있지만, 그렇게 하면 Newtonsoft.Json 네임스페이스를 계속해서 타이핑해야하기 때문에 using 지시문을 추가한다.

 

그리고 JSON 데이터와 오브젝트 간에 시리얼라이즈, 디시리얼라이즈 테스트를 위해 다음과 같은 클래스를 정의한다.

 

public class JTestClass
{
    public int i;
    public float f;
    public bool b;
    public string str;
    public int[] iArray;
    public List<int> iList = new List<int>();
    public Dictionary<string, float> fDictionary = new Dictionary<string, float>();


    public JTestClass() { }

 

    public JTestClass(bool isSet)
    {

        if (isSet)

        {
            i = 10;
            f = 99.9f;
            b = true;
            str = "JSON Test String";
            iArray = new int[] { 1, 1, 3, 5, 8, 13, 21, 34, 55 };

            for (int idx = 0; idx < 5; idx++)
            {
                iList.Add(2 * idx);
            }

 

            fDictionary.Add("PIE", Mathf.PI);
            fDictionary.Add("Epsilon", Mathf.Epsilon);
            fDictionary.Add("Sqrt(2)", Mathf.Sqrt(2));

        }
    }


    public void Print()
    {
        Debug.Log("i = " + i);
        Debug.Log("f = " + f);
        Debug.Log("b = " + b);
        Debug.Log("str = " + str);

        for (int idx = 0; idx < iArray.Length; idx++)
        {
            Debug.Log(string.Format("iArray[{0}] = {1}", idx, iArray[idx]));
        }

        for (int idx = 0; idx < iList.Count; idx++)
        {
            Debug.Log(string.Format("iList[{0}] = {1}", idx, iList[idx]));
        }

        foreach(var data in fDictionary)
        {
            Debug.Log(string.Format("iDictionary[{0}] = {1}", data.Key, data.Value));
        }
    }
}

 

여러 가지 타입과 배열, 리스트, 딕셔너리를 가지고 있는 클래스이기 때문에 오브젝트를 JSON 데이터로 변환하기에 좋은 클래스이다.

 

JSON 테스트용 클래스를 모두 작성했으면 JsonExample 클래스에 다음 함수 두 개를 구현한다.

 

string ObjectToJson(object obj)
{
    return JsonConvert.SerializeObject(obj);
}

T JsonToOject<T>(string jsonData)
{
    return JsonConvert.DeserializeObject<T>(jsonData);
}

 

ObjectToJson() 함수는 JsonConvert 클래스의 SerializeObject() 함수를 이용해서 오브젝트를 문자열로 된 JSON 데이터로 변환하여 반환하는 처리를 하고 JsonToObject() 함수는 DeserializeObject() 함수를 이용해서 문자열로 된 JSON 데이터를 받아서 원하는 타입의 객체로 반환하는 처리를 한다.

 

함수들을 모두 작성했다면 Start() 함수에 우선 ObjectToJson() 함수를 테스트하는 코드를 작성한다.

 

void Start()
{
    JTestClass jtc = new JTestClass(true);
    string jsonData = ObjectToJson(jtc);
    Debug.Log(jsonData);
}

 

코드를 저장한 뒤 에디터로 돌아가서 JsonExample을 게임 오브젝트에 붙이고 플레이 버튼을 눌러보면 JTestClass 객체가 JSON 데이터로 변환되어 로그로 출력되는 것을 확인할 수 있다.

 

 

그 다음에는 Start() 함수 아래에 JsonToObject() 함수를 테스트하는 다음 코드를 작성한다.

 

var jtc2 = JsonToOject<JTestClass>(jsonData);
jtc2.Print();

 

그리고 코드를 저장하고 에디터로 가서 플레이 버튼을 눌러보면 문자열인 JSON 데이터가 JTestClass 객체로 변환되어 정상적으로 작동하는 것을 확인할 수 있다.

 

 

 

JSON 데이터 파일로 저장하고 불러오기

 

JSON 데이터를 파일로 저장하거나 파일에 저장된 JSON 데이터 파일을 불러올 일이 있을 수 있다. 이번에는 이것에 대해서 배워보자.

 

우선은 문자열로 만든 JSON 데이터를 파일로 저장하는 코드의 예시는 다음과 같다.

 

void CreateJsonFile(string createPath, string fileName, string jsonData)
{
    FileStream fileStream = new FileStream(string.Format("{0}/{1}.json", createPath, fileName), FileMode.Create);
    byte[] data = Encoding.UTF8.GetBytes(jsonData);
    fileStream.Write(data, 0, data.Length);
    fileStream.Close();
}

 

CreateJsonFile() 함수를 작성한 뒤 Start() 함수를 아래와 같이 CreateJsonFile() 함수를 호출하도록 수정한다.

 

void Start()
{
    JTestClass jtc = new JTestClass(true);
    string jsonData = ObjectToJson(jtc);
    CreateJsonFile(Application.dataPath, "JTestClass", jsonData);
}

 

코드를 저장하고 에디터에서 플레이 해보면 dataPath인 Assets 폴더 안에 JTestClass.json 파일이 생성되고 그 내용이 제대로 쓰여져 있는 것을 확인할 수 있다.

 

 

이번에는 방금 저장한 JSON 파일을 읽어들여서 오브젝트로 변환하는 코드를 작성한다. 예시 코드는 아래와 같다.

 

T LoadJsonFile<T>(string loadPath, string fileName)
{
    FileStream fileStream = new FileStream(string.Format("{0}/{1}.json", loadPath, fileName), FileMode.Open);
    byte[] data = new byte[fileStream.Length];
    fileStream.Read(data, 0, data.Length);
    fileStream.Close();
    string jsonData = Encoding.UTF8.GetString(data);
    return JsonConvert.DeserializeObject<T>(jsonData);
}

 

LoadJsonFile() 함수를 모두 작성했으면 Start() 함수를 다음과 같이 수정한다.

 

void Start()
{
    var jtc2 = LoadJsonFile<JTestClass>(Application.dataPath, "JTestClass");
    jtc2.Print();
}

 

코드를 저장하고 에디터에서 플레이해보면 정상적으로 파일의 JSON 데이터가 로드되어서 오브젝트로 변환되어 로그가 출력된 것을 확인할 수 있다.

 

 

 

 

 

 

유니티에서 JSON 사용시 주의점

 

유니티에서 JSON을 사용할 때, 몇가지 주의점이 있다.

 

우선 유니티에서 클래스를 만들 때, 일반적으로 대다수의 클래스는 모노비헤이비어(Monobehaviour)를 상속받는다.

 

public class JsonExample : MonoBehaviour
{
    void Start()
    {
        GameObject obj = new GameObject();
        obj.AddComponent<TestMono>();
        Debug.Log(JsonConvert.SerializeObject(obj.GetComponent<TestMono>()));
    }

}

 

위의 예시 코드에 TestMono 클래스는 int 타입 변수 하나를 가지고 모노비헤이비어를 상속받는 클래스이다. 빈 게임 오브젝트에 TestMono 클래스를 컴포넌트로 붙여서 JSON데이터로 시리얼라이즈해서 로그로 출력하는 테스트인데 이를 플레이해서 테스트해보면 아래와 같이 에러가 발생한다.

 

 

 

이 예외는 gameObject에서 gameObject를 호출할 수 있는 순환구조 때문에 생기는 것인데 이것을 해결할 수는 있지만, 이후에도 다른 예외를 많이 발생시키기고 몇몇 문제는 해결책이 없기 때문에 Newtonsoft의 JSON 라이브러리로는 모노비헤이비어를 상속받는 클래스의 오브젝트를 JSON 데이터로 시리얼라이즈할 수는 없다. 그렇기 때문에 모노비헤이비어를 상속받는 클래스의 오브젝트를 시리얼라이즈하는 대신에 스크립트가 가지고 있는 프로퍼티를 클래스로 묶어서 해당 클래스만 시리얼라이즈하거나 유니티가 제공하는 JsonUntility 기능을 사용해서 시리얼라이즈하는 것을 추천한다.

 

다음은 Vector3를 시리얼라이즈하는 문제인데, Vector3를 그냥 시리얼라이즈 하려고 하면 모노비헤이비어를 시리얼라이즈하려고 할 때처럼 Self referencing loop 문제가 발생한다. 이것은 Vector3의 프로퍼티인 normalized에서 다시 normalized를 호출할 수 있기 때문에 발생하는 문제이다.

 

public class UJsonTester
{
    public Vector3 v3;

    public UJsonTester() { }

    public UJsonTester(float f)
    {
        v3 = new Vector3(f, f, f);
    }
}

 

public class JsonExample : MonoBehaviour
{
    void Start()
    {
        JsonSerializerSettings setting = new JsonSerializerSettings(); ;
        setting.Formatting = Formatting.Indented;
        setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

        UJsonTester jt = new UJsonTester(3f);
        Debug.Log(JsonConvert.SerializeObject(jt, setting));
    }

}

 

이를 해결하기 위해서는 위의 코드처럼 JsonSerializerSetting을 만들어서 ReferenceLoopHandling을 Ignore로 설정하고 시리얼라이즈를 해야한다.

 

 

하지만 이런 방식으로 레퍼런스 반복을 무시하게 만들어도 normalized 벡터나 벡터의 길이 등의 불필요한 값들이 시리얼라이즈되기 때문에, 불필요하게 JSON 데이터의 길이가 늘어나는 문제가 발생한다.

 

public class JVector3
{
    [JsonProperty("x")]
    public float x;
    [JsonProperty("y")]
    public float y;
    [JsonProperty("z")]
    public float z;

    public JVector3()
    {
        x = y = z = 0f;
    }

    public JVector3(Vector3 v)
    {
        x = v.x;
        y = v.y;
        z = v.z;
    }

    public JVector3(float f)
    {
        x = y = z = f;
    }
}

public class UJsonTester
{
    public JVector3 v3;

    public UJsonTester() { }

    public UJsonTester(float f)
    {
        v3 = new JVector3(f);
    }

    public UJsonTester(Vector3 v)
    {
        v3 = new JVector3(v);
    }
}

public class JsonExample : MonoBehaviour
{
    void Start()
    {
        UJsonTester jt = new UJsonTester(transform.position);
        Debug.Log(JsonConvert.SerializeObject(jt));
    }

}

 

외부 라이브러리를 이용해서 Vector3 중에서 x, y, z 좌표값만을 JSON 데이터로 시리얼라이즈하기를 원한다면 위의 예시 코드와 같이 별도의 시리얼라이즈용 Vector 클래스를 만들어서 시리얼라이즈를 해야한다.

 

 

이러한 번거로운 과정이 불편하다면, 유니티가 기본 제공하는 JsonUtility를 혼용해서 사용하는 방법도 있다. 유니티가 제공하는 JsonUtility로 Vector3를 시리얼라이즈하면 x, y, z 좌표값만을 JSON 데이터로 변환한다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

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를 참조하면 된다.

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

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를 사용했지만 이러한 속성은 더 이상 사용되지 않는다.

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

.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;
    }

    ...

}

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

코드 예제

 

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


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


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

 

주제

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

.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 클래스로 이동했다.

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

재시도 및 시간 초과(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
  });

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

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) );
      }
   }
}

 

 

참고사항

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

+ Recent posts